1 .file "buffer.c" 2 .arch atmega8 3 __SREG__ = 0x3f 4 __SP_H__ = 0x3e 5 __SP_L__ = 0x3d 6 __tmp_reg__ = 0 7 __zero_reg__ = 1 8 .global __do_copy_data 9 .global __do_clear_bss 12 .text 13 .Ltext0: 44 .global bufferInit 46 bufferInit: 1:../avrlib/buffer.c **** /*! \file buffer.c \brief Multipurpose byte buffer structure and methods. */ 2:../avrlib/buffer.c **** //***************************************************************************** 3:../avrlib/buffer.c **** // 4:../avrlib/buffer.c **** // File Name : 'buffer.c' 5:../avrlib/buffer.c **** // Title : Multipurpose byte buffer structure and methods 6:../avrlib/buffer.c **** // Author : Pascal Stang - Copyright (C) 2001-2002 7:../avrlib/buffer.c **** // Created : 9/23/2001 8:../avrlib/buffer.c **** // Revised : 9/23/2001 9:../avrlib/buffer.c **** // Version : 1.0 10:../avrlib/buffer.c **** // Target MCU : any 11:../avrlib/buffer.c **** // Editor Tabs : 4 12:../avrlib/buffer.c **** // 13:../avrlib/buffer.c **** // This code is distributed under the GNU Public License 14:../avrlib/buffer.c **** // which can be found at http://www.gnu.org/licenses/gpl.txt 15:../avrlib/buffer.c **** // 16:../avrlib/buffer.c **** //***************************************************************************** 17:../avrlib/buffer.c **** 18:../avrlib/buffer.c **** #include "buffer.h" 19:../avrlib/buffer.c **** 20:../avrlib/buffer.c **** // global variables 21:../avrlib/buffer.c **** 22:../avrlib/buffer.c **** // initialization 23:../avrlib/buffer.c **** 24:../avrlib/buffer.c **** void bufferInit(cBuffer* buffer, unsigned char *start, unsigned short size) 25:../avrlib/buffer.c **** { 48 .LM1: 49 /* prologue: frame size=0 */ 50 /* prologue end (size=0) */ 51 0000 FC01 movw r30,r24 26:../avrlib/buffer.c **** // set start pointer of the buffer 27:../avrlib/buffer.c **** buffer->dataptr = start; 53 .LM2: 54 0002 6083 st Z,r22 55 0004 7183 std Z+1,r23 28:../avrlib/buffer.c **** buffer->size = size; 57 .LM3: 58 0006 4283 std Z+2,r20 59 0008 5383 std Z+3,r21 29:../avrlib/buffer.c **** // initialize index and length 30:../avrlib/buffer.c **** buffer->dataindex = 0; 61 .LM4: 62 000a 1682 std Z+6,__zero_reg__ 63 000c 1782 std Z+7,__zero_reg__ 31:../avrlib/buffer.c **** buffer->datalength = 0; 65 .LM5: 66 000e 1482 std Z+4,__zero_reg__ 67 0010 1582 std Z+5,__zero_reg__ 68 /* epilogue: frame size=0 */ 69 0012 0895 ret 70 /* epilogue end (size=1) */ 71 /* function bufferInit size 10 (9) */ 73 .Lscope0: 77 .global bufferGetFromFront 79 bufferGetFromFront: 32:../avrlib/buffer.c **** } 33:../avrlib/buffer.c **** 34:../avrlib/buffer.c **** // access routines 35:../avrlib/buffer.c **** unsigned char bufferGetFromFront(cBuffer* buffer) 36:../avrlib/buffer.c **** { 81 .LM6: 82 /* prologue: frame size=0 */ 83 0014 CF93 push r28 84 0016 DF93 push r29 85 /* prologue end (size=2) */ 86 0018 EC01 movw r28,r24 37:../avrlib/buffer.c **** unsigned char data = 0; 88 .LM7: 89 001a E0E0 ldi r30,lo8(0) 38:../avrlib/buffer.c **** 39:../avrlib/buffer.c **** // check to see if there's data in the buffer 40:../avrlib/buffer.c **** if(buffer->datalength) 91 .LM8: 92 001c 2C81 ldd r18,Y+4 93 001e 3D81 ldd r19,Y+5 94 0020 2115 cp r18,__zero_reg__ 95 0022 3105 cpc r19,__zero_reg__ 96 0024 B1F0 breq .L3 41:../avrlib/buffer.c **** { 42:../avrlib/buffer.c **** // get the first character from buffer 43:../avrlib/buffer.c **** data = buffer->dataptr[buffer->dataindex]; 98 .LM9: 99 0026 E881 ld r30,Y 100 0028 F981 ldd r31,Y+1 101 002a 8E81 ldd r24,Y+6 102 002c 9F81 ldd r25,Y+7 103 002e E80F add r30,r24 104 0030 F91F adc r31,r25 105 0032 E081 ld r30,Z 44:../avrlib/buffer.c **** // move index down and decrement length 45:../avrlib/buffer.c **** buffer->dataindex++; 107 .LM10: 108 0034 0196 adiw r24,1 109 0036 8E83 std Y+6,r24 110 0038 9F83 std Y+7,r25 46:../avrlib/buffer.c **** if(buffer->dataindex >= buffer->size) 112 .LM11: 113 003a 6A81 ldd r22,Y+2 114 003c 7B81 ldd r23,Y+3 115 003e 8617 cp r24,r22 116 0040 9707 cpc r25,r23 117 0042 18F0 brlo .L4 47:../avrlib/buffer.c **** { 48:../avrlib/buffer.c **** buffer->dataindex %= buffer->size; 119 .LM12: 120 0044 00D0 rcall __udivmodhi4 121 0046 8E83 std Y+6,r24 122 0048 9F83 std Y+7,r25 123 .L4: 49:../avrlib/buffer.c **** } 50:../avrlib/buffer.c **** buffer->datalength--; 125 .LM13: 126 004a 2150 subi r18,lo8(-(-1)) 127 004c 3040 sbci r19,hi8(-(-1)) 128 004e 2C83 std Y+4,r18 129 0050 3D83 std Y+5,r19 130 .L3: 51:../avrlib/buffer.c **** } 52:../avrlib/buffer.c **** // return 53:../avrlib/buffer.c **** return data; 54:../avrlib/buffer.c **** } 132 .LM14: 133 0052 8E2F mov r24,r30 134 0054 9927 clr r25 135 /* epilogue: frame size=0 */ 136 0056 DF91 pop r29 137 0058 CF91 pop r28 138 005a 0895 ret 139 /* epilogue end (size=3) */ 140 /* function bufferGetFromFront size 36 (31) */ 145 .Lscope1: 150 .global bufferDumpFromFront 152 bufferDumpFromFront: 55:../avrlib/buffer.c **** 56:../avrlib/buffer.c **** void bufferDumpFromFront(cBuffer* buffer, unsigned short numbytes) 57:../avrlib/buffer.c **** { 154 .LM15: 155 /* prologue: frame size=0 */ 156 005c CF93 push r28 157 005e DF93 push r29 158 /* prologue end (size=2) */ 159 0060 FC01 movw r30,r24 160 0062 EB01 movw r28,r22 58:../avrlib/buffer.c **** // dump numbytes from the front of the buffer 59:../avrlib/buffer.c **** // are we dumping less than the entire buffer? 60:../avrlib/buffer.c **** if(numbytes < buffer->datalength) 162 .LM16: 163 0064 2481 ldd r18,Z+4 164 0066 3581 ldd r19,Z+5 165 0068 6217 cp r22,r18 166 006a 7307 cpc r23,r19 167 006c 98F4 brsh .L6 61:../avrlib/buffer.c **** { 62:../avrlib/buffer.c **** // move index down by numbytes and decrement length by numbytes 63:../avrlib/buffer.c **** buffer->dataindex += numbytes; 169 .LM17: 170 006e 8681 ldd r24,Z+6 171 0070 9781 ldd r25,Z+7 172 0072 860F add r24,r22 173 0074 971F adc r25,r23 174 0076 8683 std Z+6,r24 175 0078 9783 std Z+7,r25 64:../avrlib/buffer.c **** if(buffer->dataindex >= buffer->size) 177 .LM18: 178 007a 6281 ldd r22,Z+2 179 007c 7381 ldd r23,Z+3 180 007e 8617 cp r24,r22 181 0080 9707 cpc r25,r23 182 0082 18F0 brlo .L7 65:../avrlib/buffer.c **** { 66:../avrlib/buffer.c **** buffer->dataindex %= buffer->size; 184 .LM19: 185 0084 00D0 rcall __udivmodhi4 186 0086 8683 std Z+6,r24 187 0088 9783 std Z+7,r25 188 .L7: 67:../avrlib/buffer.c **** } 68:../avrlib/buffer.c **** buffer->datalength -= numbytes; 190 .LM20: 191 008a 2C1B sub r18,r28 192 008c 3D0B sbc r19,r29 193 008e 2483 std Z+4,r18 194 0090 3583 std Z+5,r19 195 0092 02C0 rjmp .L5 196 .L6: 69:../avrlib/buffer.c **** } 70:../avrlib/buffer.c **** else 71:../avrlib/buffer.c **** { 72:../avrlib/buffer.c **** // flush the whole buffer 73:../avrlib/buffer.c **** buffer->datalength = 0; 198 .LM21: 199 0094 1482 std Z+4,__zero_reg__ 200 0096 1582 std Z+5,__zero_reg__ 201 .L5: 202 /* epilogue: frame size=0 */ 203 0098 DF91 pop r29 204 009a CF91 pop r28 205 009c 0895 ret 206 /* epilogue end (size=3) */ 207 /* function bufferDumpFromFront size 33 (28) */ 209 .Lscope2: 214 .global bufferGetAtIndex 216 bufferGetAtIndex: 74:../avrlib/buffer.c **** } 75:../avrlib/buffer.c **** } 76:../avrlib/buffer.c **** 77:../avrlib/buffer.c **** unsigned char bufferGetAtIndex(cBuffer* buffer, unsigned short index) 78:../avrlib/buffer.c **** { 218 .LM22: 219 /* prologue: frame size=0 */ 220 /* prologue end (size=0) */ 221 009e FC01 movw r30,r24 79:../avrlib/buffer.c **** // return character at index in buffer 80:../avrlib/buffer.c **** return buffer->dataptr[(buffer->dataindex+index)%(buffer->size)]; 223 .LM23: 224 00a0 8681 ldd r24,Z+6 225 00a2 9781 ldd r25,Z+7 226 00a4 2281 ldd r18,Z+2 227 00a6 3381 ldd r19,Z+3 228 00a8 860F add r24,r22 229 00aa 971F adc r25,r23 230 00ac B901 movw r22,r18 231 00ae 00D0 rcall __udivmodhi4 232 00b0 0190 ld __tmp_reg__,Z+ 233 00b2 F081 ld r31,Z 234 00b4 E02D mov r30,__tmp_reg__ 235 00b6 E80F add r30,r24 236 00b8 F91F adc r31,r25 237 00ba 8081 ld r24,Z 81:../avrlib/buffer.c **** } 239 .LM24: 240 00bc 9927 clr r25 241 /* epilogue: frame size=0 */ 242 00be 0895 ret 243 /* epilogue end (size=1) */ 244 /* function bufferGetAtIndex size 17 (16) */ 246 .Lscope3: 251 .global bufferAddToEnd 253 bufferAddToEnd: 82:../avrlib/buffer.c **** 83:../avrlib/buffer.c **** unsigned char bufferAddToEnd(cBuffer* buffer, unsigned char data) 84:../avrlib/buffer.c **** { 255 .LM25: 256 /* prologue: frame size=0 */ 257 00c0 CF93 push r28 258 00c2 DF93 push r29 259 /* prologue end (size=2) */ 260 00c4 EC01 movw r28,r24 261 00c6 462F mov r20,r22 85:../avrlib/buffer.c **** // make sure the buffer has room 86:../avrlib/buffer.c **** if(buffer->datalength < buffer->size) 263 .LM26: 264 00c8 2C81 ldd r18,Y+4 265 00ca 3D81 ldd r19,Y+5 266 00cc 6A81 ldd r22,Y+2 267 00ce 7B81 ldd r23,Y+3 268 00d0 2617 cp r18,r22 269 00d2 3707 cpc r19,r23 270 00d4 90F4 brsh .L11 87:../avrlib/buffer.c **** { 88:../avrlib/buffer.c **** // save data byte at end of buffer 89:../avrlib/buffer.c **** buffer->dataptr[(buffer->dataindex + buffer->datalength) % buffer->size] = data; 272 .LM27: 273 00d6 8E81 ldd r24,Y+6 274 00d8 9F81 ldd r25,Y+7 275 00da 820F add r24,r18 276 00dc 931F adc r25,r19 277 00de 00D0 rcall __udivmodhi4 278 00e0 E881 ld r30,Y 279 00e2 F981 ldd r31,Y+1 280 00e4 E80F add r30,r24 281 00e6 F91F adc r31,r25 282 00e8 4083 st Z,r20 90:../avrlib/buffer.c **** // increment the length 91:../avrlib/buffer.c **** buffer->datalength++; 284 .LM28: 285 00ea 8C81 ldd r24,Y+4 286 00ec 9D81 ldd r25,Y+5 287 00ee 0196 adiw r24,1 288 00f0 8C83 std Y+4,r24 289 00f2 9D83 std Y+5,r25 92:../avrlib/buffer.c **** // return success 93:../avrlib/buffer.c **** return -1; 291 .LM29: 292 00f4 8FEF ldi r24,lo8(255) 293 00f6 90E0 ldi r25,hi8(255) 294 00f8 02C0 rjmp .L10 295 .L11: 94:../avrlib/buffer.c **** } 95:../avrlib/buffer.c **** else return 0; 297 .LM30: 298 00fa 80E0 ldi r24,lo8(0) 299 00fc 90E0 ldi r25,hi8(0) 300 .L10: 301 /* epilogue: frame size=0 */ 302 00fe DF91 pop r29 303 0100 CF91 pop r28 304 0102 0895 ret 305 /* epilogue end (size=3) */ 306 /* function bufferAddToEnd size 34 (29) */ 308 .Lscope4: 312 .global bufferIsNotFull 314 bufferIsNotFull: 96:../avrlib/buffer.c **** } 97:../avrlib/buffer.c **** 98:../avrlib/buffer.c **** unsigned char bufferIsNotFull(cBuffer* buffer) 99:../avrlib/buffer.c **** { 316 .LM31: 317 /* prologue: frame size=0 */ 318 /* prologue end (size=0) */ 319 0104 FC01 movw r30,r24 100:../avrlib/buffer.c **** // check to see if the buffer has room 101:../avrlib/buffer.c **** // return true if there is room 102:../avrlib/buffer.c **** return (buffer->datalength < buffer->size); 321 .LM32: 322 0106 40E0 ldi r20,lo8(0) 323 0108 50E0 ldi r21,hi8(0) 324 010a 2481 ldd r18,Z+4 325 010c 3581 ldd r19,Z+5 326 010e 8281 ldd r24,Z+2 327 0110 9381 ldd r25,Z+3 328 0112 2817 cp r18,r24 329 0114 3907 cpc r19,r25 330 0116 10F4 brsh .L14 332 .LM33: 333 0118 41E0 ldi r20,lo8(1) 334 011a 50E0 ldi r21,hi8(1) 335 .L14: 103:../avrlib/buffer.c **** } 337 .LM34: 338 011c CA01 movw r24,r20 339 /* epilogue: frame size=0 */ 340 011e 0895 ret 341 /* epilogue end (size=1) */ 342 /* function bufferIsNotFull size 14 (13) */ 344 .Lscope5: 348 .global bufferFlush 350 bufferFlush: 104:../avrlib/buffer.c **** 105:../avrlib/buffer.c **** void bufferFlush(cBuffer* buffer) 106:../avrlib/buffer.c **** { 352 .LM35: 353 /* prologue: frame size=0 */ 354 /* prologue end (size=0) */ 107:../avrlib/buffer.c **** // flush contents of the buffer 108:../avrlib/buffer.c **** buffer->datalength = 0; 356 .LM36: 357 0120 FC01 movw r30,r24 358 0122 1482 std Z+4,__zero_reg__ 359 0124 1582 std Z+5,__zero_reg__ 360 /* epilogue: frame size=0 */ 361 0126 0895 ret 362 /* epilogue end (size=1) */ 363 /* function bufferFlush size 4 (3) */ 365 .Lscope6: 367 .text 369 Letext: 370 /* File "../avrlib/buffer.c": code 148 = 0x0094 ( 129), prologues 6, epilogues 13 */ DEFINED SYMBOLS *ABS*:00000000 buffer.c *ABS*:0000003f __SREG__ *ABS*:0000003e __SP_H__ *ABS*:0000003d __SP_L__ *ABS*:00000000 __tmp_reg__ *ABS*:00000001 __zero_reg__ /var/tmp//ccWNR2QI.s:46 .text:00000000 bufferInit /var/tmp//ccWNR2QI.s:79 .text:00000014 bufferGetFromFront /var/tmp//ccWNR2QI.s:152 .text:0000005c bufferDumpFromFront /var/tmp//ccWNR2QI.s:216 .text:0000009e bufferGetAtIndex /var/tmp//ccWNR2QI.s:253 .text:000000c0 bufferAddToEnd /var/tmp//ccWNR2QI.s:314 .text:00000104 bufferIsNotFull /var/tmp//ccWNR2QI.s:350 .text:00000120 bufferFlush /var/tmp//ccWNR2QI.s:369 .text:00000128 Letext UNDEFINED SYMBOLS __do_copy_data __do_clear_bss __udivmodhi4