1 .file "generalio.c" 2 .arch atmega128 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: 71 .global PrintString 73 PrintString: 1:generalio.c **** // 2:generalio.c **** // General I/O support routines 3:generalio.c **** // 4:generalio.c **** // History: Created on May 1st 2002 by Stephane Gauthier (stephane.gauthier@alcatel.com) 5:generalio.c **** // - August 29th 2002 - S. Gauthier - Added PutHexLong() and adjusted _PutHex() accordingly. 6:generalio.c **** // - January 3rd 2003 - S. Gauthier - Added GetDecSignedWord(). 7:generalio.c **** // 8:generalio.c **** 9:generalio.c **** #include 10:generalio.c **** #include "generalio.h" // Include to prevent scope issues for routines using other routines defin 11:generalio.c **** #include "serialio.h" // For Low level routines. 12:generalio.c **** #include // For atoi(). 13:generalio.c **** #include "hardware.h" // For TRUE & FALSE. 14:generalio.c **** #include // For isxdigit() & others. 15:generalio.c **** #include // For reading strings in FLASH (PRG_RDB()) 16:generalio.c **** 17:generalio.c **** // Function Name: PrintString() 18:generalio.c **** // 19:generalio.c **** // Description: Output a character string stored in FLASH. 20:generalio.c **** // 21:generalio.c **** // 22:generalio.c **** void PrintString(const char * s) 23:generalio.c **** { 75 .LM1: 76 /* prologue: frame size=0 */ 77 0000 CF93 push r28 78 0002 DF93 push r29 79 /* prologue end (size=2) */ 80 0004 EC01 movw r28,r24 24:generalio.c **** char ch; 25:generalio.c **** while ((ch = PRG_RDB(s++))){PutChar(ch);} 82 .LM2: 83 .LBB2: 84 .LBB3: 85 0006 FC01 movw r30,r24 86 0008 2196 adiw r28,1 87 /* #APP */ 88 000a 8491 lpm r24, Z 89 /* #NOAPP */ 90 .LBE3: 91 000c 8823 tst r24 92 000e 39F0 breq .L7 93 .L5: 94 0010 0E94 0000 call PutChar 95 .LBB4: 96 0014 FE01 movw r30,r28 97 0016 2196 adiw r28,1 98 /* #APP */ 99 0018 8491 lpm r24, Z 100 /* #NOAPP */ 101 .LBE4: 102 001a 8823 tst r24 103 001c C9F7 brne .L5 104 .L7: 26:generalio.c **** } 106 .LM3: 107 .LBE2: 108 /* epilogue: frame size=0 */ 109 001e DF91 pop r29 110 0020 CF91 pop r28 111 0022 0895 ret 112 /* epilogue end (size=3) */ 113 /* function PrintString size 20 (15) */ 124 .Lscope0: 127 .global _GetChar 129 _GetChar: 27:generalio.c **** 28:generalio.c **** // Function Name: _GetChar() 29:generalio.c **** // 30:generalio.c **** // Description: Get a character from serial port and echo it back. 31:generalio.c **** // 32:generalio.c **** // 33:generalio.c **** unsigned char _GetChar(void) 34:generalio.c **** { 131 .LM4: 132 /* prologue: frame size=0 */ 133 0024 1F93 push r17 134 /* prologue end (size=1) */ 35:generalio.c **** unsigned char data; 36:generalio.c **** 37:generalio.c **** data = GetChar(); 136 .LM5: 137 .LBB5: 138 0026 0E94 0000 call GetChar 139 002a 182F mov r17,r24 38:generalio.c **** PutChar(data); 141 .LM6: 142 002c 0E94 0000 call PutChar 39:generalio.c **** 40:generalio.c **** return(data); 144 .LM7: 145 0030 812F mov r24,r17 146 0032 9927 clr r25 41:generalio.c **** } 148 .LM8: 149 .LBE5: 150 /* epilogue: frame size=0 */ 151 0034 1F91 pop r17 152 0036 0895 ret 153 /* epilogue end (size=2) */ 154 /* function _GetChar size 10 (7) */ 159 .Lscope1: 162 .global GetHexWord 164 GetHexWord: 42:generalio.c **** 43:generalio.c **** // Function Name: GetHexWord() 44:generalio.c **** // 45:generalio.c **** // Description: Get a Hex Word from serial port. 46:generalio.c **** // 47:generalio.c **** // 48:generalio.c **** unsigned int GetHexWord(void) 49:generalio.c **** { 166 .LM9: 167 /* prologue: frame size=0 */ 168 /* prologue end (size=0) */ 50:generalio.c **** return(_GetHex(4)); // Get Four digits 170 .LM10: 171 0038 84E0 ldi r24,lo8(4) 172 003a 0E94 0000 call _GetHex 51:generalio.c **** } 174 .LM11: 175 /* epilogue: frame size=0 */ 176 003e 0895 ret 177 /* epilogue end (size=1) */ 178 /* function GetHexWord size 4 (3) */ 180 .Lscope2: 183 .global GetHexByte 185 GetHexByte: 52:generalio.c **** 53:generalio.c **** // Function Name: GetHexByte() 54:generalio.c **** // 55:generalio.c **** // Description: Get a Hex Byte from serial port. 56:generalio.c **** // 57:generalio.c **** // 58:generalio.c **** unsigned char GetHexByte(void) 59:generalio.c **** { 187 .LM12: 188 /* prologue: frame size=0 */ 189 /* prologue end (size=0) */ 60:generalio.c **** return(_GetHex(2)); // Get Two digits 191 .LM13: 192 0040 82E0 ldi r24,lo8(2) 193 0042 0E94 0000 call _GetHex 194 0046 9927 clr r25 61:generalio.c **** } 196 .LM14: 197 /* epilogue: frame size=0 */ 198 0048 0895 ret 199 /* epilogue end (size=1) */ 200 /* function GetHexByte size 5 (4) */ 202 .Lscope3: 205 .global GetHexChar 207 GetHexChar: 62:generalio.c **** 63:generalio.c **** // Function Name: GetHexChar() 64:generalio.c **** // 65:generalio.c **** // Description: Get a single Hex digit from serial port. 66:generalio.c **** // 67:generalio.c **** // 68:generalio.c **** unsigned char GetHexChar(void) 69:generalio.c **** { 209 .LM15: 210 /* prologue: frame size=0 */ 211 /* prologue end (size=0) */ 70:generalio.c **** return(_GetHex(1)); // Get One digit 213 .LM16: 214 004a 81E0 ldi r24,lo8(1) 215 004c 0E94 0000 call _GetHex 216 0050 9927 clr r25 71:generalio.c **** } 218 .LM17: 219 /* epilogue: frame size=0 */ 220 0052 0895 ret 221 /* epilogue end (size=1) */ 222 /* function GetHexChar size 5 (4) */ 224 .Lscope4: 228 .global _GetHex 230 _GetHex: 72:generalio.c **** 73:generalio.c **** // Function Name: _GetHex() 74:generalio.c **** // 75:generalio.c **** // Description: Get the specified number of Hex digit from serial port. 76:generalio.c **** // 77:generalio.c **** // 78:generalio.c **** unsigned int _GetHex(unsigned char digits) 79:generalio.c **** { 232 .LM18: 233 /* prologue: frame size=1 */ 234 0054 AF92 push r10 235 0056 BF92 push r11 236 0058 DF92 push r13 237 005a EF92 push r14 238 005c FF92 push r15 239 005e 0F93 push r16 240 0060 1F93 push r17 241 0062 CF93 push r28 242 0064 DF93 push r29 243 0066 CDB7 in r28,__SP_L__ 244 0068 DEB7 in r29,__SP_H__ 245 006a 2197 sbiw r28,1 246 006c 0FB6 in __tmp_reg__,__SREG__ 247 006e F894 cli 248 0070 DEBF out __SP_H__,r29 249 0072 0FBE out __SREG__,__tmp_reg__ 250 0074 CDBF out __SP_L__,r28 251 /* prologue end (size=17) */ 80:generalio.c **** unsigned int value = 0; 253 .LM19: 254 .LBB6: 255 0076 AA24 clr r10 256 0078 BB24 clr r11 81:generalio.c **** unsigned char i = 0; 82:generalio.c **** unsigned char digit; 83:generalio.c **** unsigned char temp = 0; 84:generalio.c **** 85:generalio.c **** for (i = digits ; i > 0 ; i--) 258 .LM20: 259 007a D82E mov r13,r24 260 007c 8823 tst r24 261 007e 89F1 breq .L25 262 .L26: 86:generalio.c **** { 87:generalio.c **** do 88:generalio.c **** { 89:generalio.c **** digit = GetChar(); 264 .LM21: 265 0080 0E94 0000 call GetChar 266 0084 182F mov r17,r24 267 0086 8983 std Y+1,r24 90:generalio.c **** }while (!isxdigit(digit)); // Validate input 269 .LM22: 270 0088 9927 clr r25 271 008a 0E94 0000 call isxdigit 272 008e 892B or r24,r25 273 0090 B9F3 breq .L26 91:generalio.c **** 92:generalio.c **** PutChar(digit); // Echo it 275 .LM23: 276 0092 812F mov r24,r17 277 0094 0E94 0000 call PutChar 93:generalio.c **** 94:generalio.c **** if (isalpha(digit)) 279 .LM24: 280 0098 8981 ldd r24,Y+1 281 009a E82E mov r14,r24 282 009c FF24 clr r15 283 009e C701 movw r24,r14 284 00a0 0E94 0000 call isalpha 285 00a4 0D2D mov r16,r13 286 00a6 1127 clr r17 287 00a8 DA94 dec r13 288 00aa 892B or r24,r25 289 00ac 39F0 breq .L21 95:generalio.c **** { 96:generalio.c **** digit = toupper(digit); 291 .LM25: 292 00ae C701 movw r24,r14 293 00b0 0E94 0000 call toupper 294 00b4 8983 std Y+1,r24 97:generalio.c **** temp = digit - 0x37; 296 .LM26: 297 00b6 8753 subi r24,lo8(-(-55)) 98:generalio.c **** value += temp << (4 * (i-1)); 299 .LM27: 300 00b8 9927 clr r25 301 00ba 04C0 rjmp .L27 302 .L21: 99:generalio.c **** } 100:generalio.c **** else 101:generalio.c **** value += (atoi((unsigned char *)&digit) << (4 * (i-1))); 304 .LM28: 305 00bc CE01 movw r24,r28 306 00be 0196 adiw r24,1 307 00c0 0E94 0000 call atoi 308 .L27: 309 00c4 000F lsl r16 310 00c6 111F rol r17 311 00c8 000F lsl r16 312 00ca 111F rol r17 313 00cc 0450 subi r16,lo8(-(-4)) 314 00ce 1040 sbci r17,hi8(-(-4)) 315 00d0 02C0 rjmp 2f 316 00d2 880F 1: lsl r24 317 00d4 991F rol r25 318 00d6 0A95 2: dec r16 319 00d8 E2F7 brpl 1b 320 00da A80E add r10,r24 321 00dc B91E adc r11,r25 323 .LM29: 324 00de DD20 tst r13 325 00e0 79F6 brne .L26 326 .L25: 102:generalio.c **** 103:generalio.c **** } 104:generalio.c **** 105:generalio.c **** return(value); 106:generalio.c **** } 328 .LM30: 329 .LBE6: 330 00e2 C501 movw r24,r10 331 /* epilogue: frame size=1 */ 332 00e4 2196 adiw r28,1 333 00e6 0FB6 in __tmp_reg__,__SREG__ 334 00e8 F894 cli 335 00ea DEBF out __SP_H__,r29 336 00ec 0FBE out __SREG__,__tmp_reg__ 337 00ee CDBF out __SP_L__,r28 338 00f0 DF91 pop r29 339 00f2 CF91 pop r28 340 00f4 1F91 pop r17 341 00f6 0F91 pop r16 342 00f8 FF90 pop r15 343 00fa EF90 pop r14 344 00fc DF90 pop r13 345 00fe BF90 pop r11 346 0100 AF90 pop r10 347 0102 0895 ret 348 /* epilogue end (size=16) */ 349 /* function _GetHex size 89 (56) */ 356 .Lscope5: 360 .global PutHexLong 362 PutHexLong: 107:generalio.c **** 108:generalio.c **** // Function Name: PutHexLong() 109:generalio.c **** // 110:generalio.c **** // Description: Format and output Long (32bits) Word to serial port. 111:generalio.c **** // 112:generalio.c **** // 113:generalio.c **** void PutHexLong(unsigned long data) 114:generalio.c **** { 364 .LM31: 365 /* prologue: frame size=0 */ 366 0104 EF92 push r14 367 0106 FF92 push r15 368 0108 0F93 push r16 369 010a 1F93 push r17 370 /* prologue end (size=4) */ 371 010c 7B01 movw r14,r22 372 010e 8C01 movw r16,r24 115:generalio.c **** // To prevent confusion with decimal 116:generalio.c **** PutChar('0'); 374 .LM32: 375 0110 80E3 ldi r24,lo8(48) 376 0112 0E94 0000 call PutChar 117:generalio.c **** PutChar('x'); 378 .LM33: 379 0116 88E7 ldi r24,lo8(120) 380 0118 0E94 0000 call PutChar 118:generalio.c **** 119:generalio.c **** _PutHex(data>>16, 2); // Put out upper Four Hex digits. 382 .LM34: 383 011c C801 movw r24,r16 384 011e AA27 clr r26 385 0120 BB27 clr r27 386 0122 62E0 ldi r22,lo8(2) 387 0124 0E94 0000 call _PutHex 120:generalio.c **** _PutHex(data, 2); 389 .LM35: 390 0128 62E0 ldi r22,lo8(2) 391 012a C701 movw r24,r14 392 012c 0E94 0000 call _PutHex 121:generalio.c **** } 394 .LM36: 395 /* epilogue: frame size=0 */ 396 0130 1F91 pop r17 397 0132 0F91 pop r16 398 0134 FF90 pop r15 399 0136 EF90 pop r14 400 0138 0895 ret 401 /* epilogue end (size=5) */ 402 /* function PutHexLong size 27 (18) */ 404 .Lscope6: 408 .global PutHexWord 410 PutHexWord: 122:generalio.c **** 123:generalio.c **** 124:generalio.c **** // Function Name: PutHexWord() 125:generalio.c **** // 126:generalio.c **** // Description: Format and output Hex Word (16bits)to serial port. 127:generalio.c **** // 128:generalio.c **** // 129:generalio.c **** void PutHexWord(unsigned int data) 130:generalio.c **** { 412 .LM37: 413 /* prologue: frame size=0 */ 414 013a 0F93 push r16 415 013c 1F93 push r17 416 /* prologue end (size=2) */ 417 013e 8C01 movw r16,r24 131:generalio.c **** // To prevent confusion with decimal 132:generalio.c **** PutChar('0'); 419 .LM38: 420 0140 80E3 ldi r24,lo8(48) 421 0142 0E94 0000 call PutChar 133:generalio.c **** PutChar('x'); 423 .LM39: 424 0146 88E7 ldi r24,lo8(120) 425 0148 0E94 0000 call PutChar 134:generalio.c **** 135:generalio.c **** _PutHex(data, 2); // Put out Four Hex digits. 427 .LM40: 428 014c 62E0 ldi r22,lo8(2) 429 014e C801 movw r24,r16 430 0150 0E94 0000 call _PutHex 136:generalio.c **** } 432 .LM41: 433 /* epilogue: frame size=0 */ 434 0154 1F91 pop r17 435 0156 0F91 pop r16 436 0158 0895 ret 437 /* epilogue end (size=3) */ 438 /* function PutHexWord size 16 (11) */ 440 .Lscope7: 444 .global PutHexByte 446 PutHexByte: 137:generalio.c **** 138:generalio.c **** // Function Name: PutHexByte() 139:generalio.c **** // 140:generalio.c **** // Description: Format and output Hex Byte (8bits) to serial port. 141:generalio.c **** // 142:generalio.c **** // 143:generalio.c **** void PutHexByte(unsigned char data) 144:generalio.c **** { 448 .LM42: 449 /* prologue: frame size=0 */ 450 015a 1F93 push r17 451 /* prologue end (size=1) */ 452 015c 182F mov r17,r24 145:generalio.c **** // To prevent confusion with decimal 146:generalio.c **** PutChar('0'); 454 .LM43: 455 015e 80E3 ldi r24,lo8(48) 456 0160 0E94 0000 call PutChar 147:generalio.c **** PutChar('x'); 458 .LM44: 459 0164 88E7 ldi r24,lo8(120) 460 0166 0E94 0000 call PutChar 148:generalio.c **** 149:generalio.c **** _PutHex((unsigned char)data, 1); // Put out Two Hex digits. 462 .LM45: 463 016a 812F mov r24,r17 464 016c 9927 clr r25 465 016e 61E0 ldi r22,lo8(1) 466 0170 0E94 0000 call _PutHex 150:generalio.c **** } 468 .LM46: 469 /* epilogue: frame size=0 */ 470 0174 1F91 pop r17 471 0176 0895 ret 472 /* epilogue end (size=2) */ 473 /* function PutHexByte size 15 (12) */ 475 .Lscope8: 479 .global PutHexChar 481 PutHexChar: 151:generalio.c **** 152:generalio.c **** // Function Name: PutHexChar() 153:generalio.c **** // 154:generalio.c **** // Description: Format and output a single Hex digit to serial port. 155:generalio.c **** // 156:generalio.c **** // 157:generalio.c **** void PutHexChar(unsigned char data) 158:generalio.c **** { 483 .LM47: 484 /* prologue: frame size=0 */ 485 0178 1F93 push r17 486 /* prologue end (size=1) */ 487 017a 182F mov r17,r24 159:generalio.c **** // To prevent confusion with decimal 160:generalio.c **** PutChar('0'); 489 .LM48: 490 017c 80E3 ldi r24,lo8(48) 491 017e 0E94 0000 call PutChar 161:generalio.c **** PutChar('x'); 493 .LM49: 494 0182 88E7 ldi r24,lo8(120) 495 0184 0E94 0000 call PutChar 162:generalio.c **** 163:generalio.c **** PutChar(asciify(data)); // Put out One Hex digits. 497 .LM50: 498 0188 812F mov r24,r17 499 018a 0E94 0000 call asciify 500 018e 0E94 0000 call PutChar 164:generalio.c **** } 502 .LM51: 503 /* epilogue: frame size=0 */ 504 0192 1F91 pop r17 505 0194 0895 ret 506 /* epilogue end (size=2) */ 507 /* function PutHexChar size 15 (12) */ 509 .Lscope9: 514 .global _PutHex 516 _PutHex: 165:generalio.c **** 166:generalio.c **** // Function Name: _PutHex() 167:generalio.c **** // 168:generalio.c **** // Description: Format and output specified number of Hex byte to serial port. 169:generalio.c **** // 170:generalio.c **** // 171:generalio.c **** void _PutHex(unsigned int data, unsigned char size) 172:generalio.c **** { 518 .LM52: 519 /* prologue: frame size=0 */ 520 0196 0F93 push r16 521 0198 1F93 push r17 522 019a CF93 push r28 523 019c DF93 push r29 524 /* prologue end (size=4) */ 525 019e 8C01 movw r16,r24 173:generalio.c **** unsigned int temp; 174:generalio.c **** 175:generalio.c **** if (size > 1) 527 .LM53: 528 .LBB7: 529 01a0 6230 cpi r22,lo8(2) 530 01a2 80F0 brlo .L33 176:generalio.c **** { 177:generalio.c **** // Do Upper nibble 178:generalio.c **** temp = data >> 8; 532 .LM54: 533 01a4 C12F mov r28,r17 534 01a6 DD27 clr r29 179:generalio.c **** PutChar(asciify(temp>>4)); 536 .LM55: 537 01a8 C801 movw r24,r16 538 01aa 892F mov r24,r25 539 01ac 9927 clr r25 540 01ae 8295 swap r24 541 01b0 8F70 andi r24,0x0f 542 01b2 0E94 0000 call asciify 543 01b6 0E94 0000 call PutChar 180:generalio.c **** 181:generalio.c **** // Do lower nibble 182:generalio.c **** PutChar(asciify(temp)); 545 .LM56: 546 01ba 8C2F mov r24,r28 547 01bc 0E94 0000 call asciify 548 01c0 0E94 0000 call PutChar 549 .L33: 183:generalio.c **** } 184:generalio.c **** 185:generalio.c **** // Do Upper nibble 186:generalio.c **** temp = data >> 4; 551 .LM57: 552 01c4 E801 movw r28,r16 553 01c6 44E0 ldi r20,4 554 01c8 D695 1: lsr r29 555 01ca C795 ror r28 556 01cc 4A95 dec r20 557 01ce E1F7 brne 1b 187:generalio.c **** PutChar(asciify(temp)); 559 .LM58: 560 01d0 8C2F mov r24,r28 561 01d2 0E94 0000 call asciify 562 01d6 0E94 0000 call PutChar 188:generalio.c **** 189:generalio.c **** // Do lower nibble 190:generalio.c **** PutChar(asciify(data)); 564 .LM59: 565 01da 802F mov r24,r16 566 01dc 0E94 0000 call asciify 567 01e0 0E94 0000 call PutChar 191:generalio.c **** } 569 .LM60: 570 .LBE7: 571 /* epilogue: frame size=0 */ 572 01e4 DF91 pop r29 573 01e6 CF91 pop r28 574 01e8 1F91 pop r17 575 01ea 0F91 pop r16 576 01ec 0895 ret 577 /* epilogue end (size=5) */ 578 /* function _PutHex size 44 (35) */ 583 .Lscope10: 586 .global PutCRLF 588 PutCRLF: 192:generalio.c **** 193:generalio.c **** // Function Name: PutCRLF() 194:generalio.c **** // 195:generalio.c **** // Description: Bring terminal cursor to beginning of next line 196:generalio.c **** // 197:generalio.c **** // 198:generalio.c **** void PutCRLF(void) 199:generalio.c **** { 590 .LM61: 591 /* prologue: frame size=0 */ 592 /* prologue end (size=0) */ 200:generalio.c **** PutChar(0x0D); 594 .LM62: 595 01ee 8DE0 ldi r24,lo8(13) 596 01f0 0E94 0000 call PutChar 201:generalio.c **** PutChar(0x0A); 598 .LM63: 599 01f4 8AE0 ldi r24,lo8(10) 600 01f6 0E94 0000 call PutChar 202:generalio.c **** } 602 .LM64: 603 /* epilogue: frame size=0 */ 604 01fa 0895 ret 605 /* epilogue end (size=1) */ 606 /* function PutCRLF size 7 (6) */ 608 .Lscope11: 612 .global asciify 614 asciify: 203:generalio.c **** 204:generalio.c **** // Function Name: asciffy() 205:generalio.c **** // 206:generalio.c **** // Description: Convert low nibble to character. 207:generalio.c **** // 208:generalio.c **** // 209:generalio.c **** unsigned char asciify(unsigned char value) 210:generalio.c **** { 616 .LM65: 617 /* prologue: frame size=0 */ 618 /* prologue end (size=0) */ 211:generalio.c **** // Check for invalid out-of-range value and return the ? symbol. 212:generalio.c **** value = value & 0x0F; //truncate unused upper nibble 620 .LM66: 621 01fc 8F70 andi r24,lo8(15) 213:generalio.c **** 214:generalio.c **** if (value > 0x09) 623 .LM67: 624 01fe 8A30 cpi r24,lo8(10) 625 0200 10F0 brlo .L36 215:generalio.c **** return(value + 0x37); 627 .LM68: 628 0202 895C subi r24,lo8(-(55)) 629 0204 01C0 rjmp .L38 630 .L36: 216:generalio.c **** else 217:generalio.c **** return(value + 0x30); 632 .LM69: 633 0206 805D subi r24,lo8(-(48)) 634 .L38: 635 0208 9927 clr r25 218:generalio.c **** } 637 .LM70: 638 020a 0895 ret 639 /* epilogue: frame size=0 */ 640 020c 0895 ret 641 /* epilogue end (size=1) */ 642 /* function asciify size 9 (8) */ 644 .Lscope12: 647 .global GetDecWord 649 GetDecWord: 219:generalio.c **** 220:generalio.c **** 221:generalio.c **** 222:generalio.c **** // Function Name: GetDecWord() 223:generalio.c **** // 224:generalio.c **** // Description: Reads in a 3 digit decimal number from the serial port 225:generalio.c **** // 226:generalio.c **** // 227:generalio.c **** unsigned int GetDecWord(void) 228:generalio.c **** { 651 .LM71: 652 /* prologue: frame size=0 */ 653 020e 0F93 push r16 654 0210 1F93 push r17 655 0212 CF93 push r28 656 /* prologue end (size=3) */ 229:generalio.c **** unsigned int total = 0; 230:generalio.c **** unsigned char in; 231:generalio.c **** 232:generalio.c **** // Get valid digit for 100's 233:generalio.c **** 234:generalio.c **** in = GetChar(); 658 .LM72: 659 .LBB8: 660 0214 0E94 0000 call GetChar 661 0218 C82F mov r28,r24 235:generalio.c **** while ( in < '0' || in > '9') 663 .LM73: 664 021a 8053 subi r24,lo8(-(-48)) 665 021c 8A30 cpi r24,lo8(10) 666 021e 30F0 brlo .L53 667 .L43: 236:generalio.c **** in = GetChar(); 669 .LM74: 670 0220 0E94 0000 call GetChar 671 0224 C82F mov r28,r24 672 0226 8053 subi r24,lo8(-(-48)) 673 0228 8A30 cpi r24,lo8(10) 674 022a D0F7 brsh .L43 675 .L53: 237:generalio.c **** 238:generalio.c **** PutChar(in); 677 .LM75: 678 022c 8C2F mov r24,r28 679 022e 0E94 0000 call PutChar 239:generalio.c **** 240:generalio.c **** total = (in - '0') * 100; 681 .LM76: 682 0232 84E6 ldi r24,lo8(100) 683 0234 C89F mul r28,r24 684 0236 8001 movw r16,r0 685 0238 1124 clr r1 686 023a 005C subi r16,lo8(-(-4800)) 687 023c 1241 sbci r17,hi8(-(-4800)) 241:generalio.c **** 242:generalio.c **** // Get valid digit for 10's 243:generalio.c **** 244:generalio.c **** in = GetChar(); 689 .LM77: 690 023e 0E94 0000 call GetChar 691 0242 C82F mov r28,r24 245:generalio.c **** while ( in < '0' || in > '9') 693 .LM78: 694 0244 8053 subi r24,lo8(-(-48)) 695 0246 8A30 cpi r24,lo8(10) 696 0248 30F0 brlo .L55 697 .L47: 246:generalio.c **** in = GetChar(); 699 .LM79: 700 024a 0E94 0000 call GetChar 701 024e C82F mov r28,r24 702 0250 8053 subi r24,lo8(-(-48)) 703 0252 8A30 cpi r24,lo8(10) 704 0254 D0F7 brsh .L47 705 .L55: 247:generalio.c **** 248:generalio.c **** PutChar(in); 707 .LM80: 708 0256 8C2F mov r24,r28 709 0258 0E94 0000 call PutChar 249:generalio.c **** 250:generalio.c **** total += (in - '0') * 10; 711 .LM81: 712 025c 8AE0 ldi r24,lo8(10) 713 025e C89F mul r28,r24 714 0260 C001 movw r24,r0 715 0262 1124 clr r1 716 0264 080F add r16,r24 717 0266 191F adc r17,r25 718 0268 005E subi r16,lo8(-(-480)) 719 026a 1140 sbci r17,hi8(-(-480)) 251:generalio.c **** 252:generalio.c **** // Get valid digit for 1's 253:generalio.c **** 254:generalio.c **** in = GetChar(); 721 .LM82: 722 026c 0E94 0000 call GetChar 723 0270 C82F mov r28,r24 255:generalio.c **** while ( in < '0' || in > '9') 725 .LM83: 726 0272 8053 subi r24,lo8(-(-48)) 727 0274 8A30 cpi r24,lo8(10) 728 0276 30F0 brlo .L57 729 .L51: 256:generalio.c **** in = GetChar(); 731 .LM84: 732 0278 0E94 0000 call GetChar 733 027c C82F mov r28,r24 734 027e 8053 subi r24,lo8(-(-48)) 735 0280 8A30 cpi r24,lo8(10) 736 0282 D0F7 brsh .L51 737 .L57: 257:generalio.c **** 258:generalio.c **** PutChar(in); 739 .LM85: 740 0284 8C2F mov r24,r28 741 0286 0E94 0000 call PutChar 259:generalio.c **** 260:generalio.c **** total += (in - '0'); 743 .LM86: 744 028a C801 movw r24,r16 745 028c 8C0F add r24,r28 746 028e 911D adc r25,__zero_reg__ 747 0290 C097 sbiw r24,48 261:generalio.c **** 262:generalio.c **** return(total); 263:generalio.c **** } 749 .LM87: 750 .LBE8: 751 /* epilogue: frame size=0 */ 752 0292 CF91 pop r28 753 0294 1F91 pop r17 754 0296 0F91 pop r16 755 0298 0895 ret 756 /* epilogue end (size=4) */ 757 /* function GetDecWord size 70 (63) */ 763 .Lscope13: 767 .global PutDecWord 769 PutDecWord: 264:generalio.c **** 265:generalio.c **** 266:generalio.c **** 267:generalio.c **** // Function Name: PutDecWord() 268:generalio.c **** // 269:generalio.c **** // Description: This function will format and send a Word to the serial port in a decimal forma 270:generalio.c **** // 271:generalio.c **** // 272:generalio.c **** void PutDecWord(unsigned int value) 273:generalio.c **** { 771 .LM88: 772 /* prologue: frame size=0 */ 773 029a CF93 push r28 774 029c DF93 push r29 775 /* prologue end (size=2) */ 776 029e EC01 movw r28,r24 274:generalio.c **** unsigned char count = 0; 778 .LM89: 779 .LBB9: 780 02a0 80E0 ldi r24,lo8(0) 275:generalio.c **** 276:generalio.c **** // Special case 277:generalio.c **** if (value == 0) 782 .LM90: 783 02a2 2097 sbiw r28,0 784 02a4 11F4 brne .L59 278:generalio.c **** { 279:generalio.c **** PutChar('0'); 786 .LM91: 787 02a6 80E3 ldi r24,lo8(48) 788 02a8 48C0 rjmp .L92 789 .L59: 280:generalio.c **** return; 281:generalio.c **** } 282:generalio.c **** 283:generalio.c **** /* how many hundred of thousands? */ 284:generalio.c **** /* 285:generalio.c **** while(value > 99999) 286:generalio.c **** { 287:generalio.c **** value = value - 100000; 288:generalio.c **** count++; 289:generalio.c **** } 290:generalio.c **** if (count != 0 || value == 0) // Remove leading 0s 291:generalio.c **** PutChar('0' + count); 292:generalio.c **** 293:generalio.c **** count = 0; 294:generalio.c **** */ 295:generalio.c **** /* how many tens of thousands? */ 296:generalio.c **** while(value > 9999) 791 .LM92: 792 02aa 97E2 ldi r25,hi8(10000) 793 02ac C031 cpi r28,lo8(10000) 794 02ae D907 cpc r29,r25 795 02b0 38F0 brlo .L85 796 .L63: 297:generalio.c **** { 298:generalio.c **** value = value - 10000; 798 .LM93: 799 02b2 C051 subi r28,lo8(-(-10000)) 800 02b4 D742 sbci r29,hi8(-(-10000)) 299:generalio.c **** count++; 802 .LM94: 803 02b6 8F5F subi r24,lo8(-(1)) 804 02b8 97E2 ldi r25,hi8(10000) 805 02ba C031 cpi r28,lo8(10000) 806 02bc D907 cpc r29,r25 807 02be C8F7 brsh .L63 808 .L85: 300:generalio.c **** } 301:generalio.c **** if (count != 0 || value == 0) // Remove leading 0s 810 .LM95: 811 02c0 8823 tst r24 812 02c2 11F4 brne .L65 813 02c4 2097 sbiw r28,0 814 02c6 19F4 brne .L64 815 .L65: 302:generalio.c **** PutChar('0' + count); 817 .LM96: 818 02c8 805D subi r24,lo8(-(48)) 819 02ca 0E94 0000 call PutChar 820 .L64: 303:generalio.c **** 304:generalio.c **** count = 0; 822 .LM97: 823 02ce 80E0 ldi r24,lo8(0) 305:generalio.c **** 306:generalio.c **** /* how many thousands? */ 307:generalio.c **** while(value > 999) 825 .LM98: 826 02d0 93E0 ldi r25,hi8(1000) 827 02d2 C83E cpi r28,lo8(1000) 828 02d4 D907 cpc r29,r25 829 02d6 38F0 brlo .L87 830 .L69: 308:generalio.c **** { 309:generalio.c **** value = value - 1000; 832 .LM99: 833 02d8 C85E subi r28,lo8(-(-1000)) 834 02da D340 sbci r29,hi8(-(-1000)) 310:generalio.c **** count++; 836 .LM100: 837 02dc 8F5F subi r24,lo8(-(1)) 838 02de 93E0 ldi r25,hi8(1000) 839 02e0 C83E cpi r28,lo8(1000) 840 02e2 D907 cpc r29,r25 841 02e4 C8F7 brsh .L69 842 .L87: 311:generalio.c **** } 312:generalio.c **** if (count != 0 || value == 0) // Remove leading 0s 844 .LM101: 845 02e6 8823 tst r24 846 02e8 11F4 brne .L71 847 02ea 2097 sbiw r28,0 848 02ec 19F4 brne .L70 849 .L71: 313:generalio.c **** PutChar('0' + count); 851 .LM102: 852 02ee 805D subi r24,lo8(-(48)) 853 02f0 0E94 0000 call PutChar 854 .L70: 314:generalio.c **** 315:generalio.c **** count = 0; 856 .LM103: 857 02f4 80E0 ldi r24,lo8(0) 316:generalio.c **** 317:generalio.c **** /* how many hundreds? */ 318:generalio.c **** while(value > 99) 859 .LM104: 860 02f6 C436 cpi r28,100 861 02f8 D105 cpc r29,__zero_reg__ 862 02fa 30F0 brlo .L89 863 .L75: 319:generalio.c **** { 320:generalio.c **** value = value - 100; 865 .LM105: 866 02fc C456 subi r28,lo8(-(-100)) 867 02fe D040 sbci r29,hi8(-(-100)) 321:generalio.c **** count++; 869 .LM106: 870 0300 8F5F subi r24,lo8(-(1)) 871 0302 C436 cpi r28,100 872 0304 D105 cpc r29,__zero_reg__ 873 0306 D0F7 brsh .L75 874 .L89: 322:generalio.c **** } 323:generalio.c **** if (count != 0 || value == 0) // Remove leading 0s 876 .LM107: 877 0308 8823 tst r24 878 030a 11F4 brne .L77 879 030c 2097 sbiw r28,0 880 030e 19F4 brne .L76 881 .L77: 324:generalio.c **** PutChar('0' + count); 883 .LM108: 884 0310 805D subi r24,lo8(-(48)) 885 0312 0E94 0000 call PutChar 886 .L76: 325:generalio.c **** 326:generalio.c **** /* how many tens? */ 327:generalio.c **** count = 0; 888 .LM109: 889 0316 80E0 ldi r24,lo8(0) 328:generalio.c **** 329:generalio.c **** while(value > 9) 891 .LM110: 892 0318 CA30 cpi r28,10 893 031a D105 cpc r29,__zero_reg__ 894 031c 28F0 brlo .L91 895 .L81: 330:generalio.c **** { 331:generalio.c **** value = value - 10; 897 .LM111: 898 031e 2A97 sbiw r28,10 332:generalio.c **** count++; 900 .LM112: 901 0320 8F5F subi r24,lo8(-(1)) 902 0322 CA30 cpi r28,10 903 0324 D105 cpc r29,__zero_reg__ 904 0326 D8F7 brsh .L81 905 .L91: 333:generalio.c **** } 334:generalio.c **** if (count != 0 || value == 0) // Remove leading 0s 907 .LM113: 908 0328 8823 tst r24 909 032a 11F4 brne .L83 910 032c 2097 sbiw r28,0 911 032e 19F4 brne .L82 912 .L83: 335:generalio.c **** PutChar('0' + count); 914 .LM114: 915 0330 805D subi r24,lo8(-(48)) 916 0332 0E94 0000 call PutChar 917 .L82: 336:generalio.c **** 337:generalio.c **** /* and finally units */ 338:generalio.c **** PutChar('0' + value); 919 .LM115: 920 0336 8C2F mov r24,r28 921 0338 805D subi r24,lo8(-(48)) 922 .L92: 923 033a 0E94 0000 call PutChar 339:generalio.c **** } 925 .LM116: 926 .LBE9: 927 /* epilogue: frame size=0 */ 928 033e DF91 pop r29 929 0340 CF91 pop r28 930 0342 0895 ret 931 /* epilogue end (size=3) */ 932 /* function PutDecWord size 85 (80) */ 937 .Lscope14: 941 .global PutDecSignedByte 943 PutDecSignedByte: 340:generalio.c **** 341:generalio.c **** // Function Name: PutDecSignedByte() 342:generalio.c **** // 343:generalio.c **** // Description: This function will format and send a SIGNED BYTE to the serial port in a decima 344:generalio.c **** // 345:generalio.c **** // 346:generalio.c **** void PutDecSignedByte(signed char value) 347:generalio.c **** { 945 .LM117: 946 /* prologue: frame size=0 */ 947 0344 CF93 push r28 948 /* prologue end (size=1) */ 949 0346 C82F mov r28,r24 348:generalio.c **** if (value > 0) 951 .LM118: 952 0348 1816 cp __zero_reg__,r24 953 034a 14F4 brge .L94 349:generalio.c **** PutChar('+'); 955 .LM119: 956 034c 8BE2 ldi r24,lo8(43) 957 034e 03C0 rjmp .L98 958 .L94: 350:generalio.c **** else 351:generalio.c **** if (value < 0) 960 .LM120: 961 0350 87FF sbrs r24,7 962 0352 03C0 rjmp .L95 352:generalio.c **** PutChar('-'); 964 .LM121: 965 0354 8DE2 ldi r24,lo8(45) 966 .L98: 967 0356 0E94 0000 call PutChar 968 .L95: 353:generalio.c **** 354:generalio.c **** // Otherwise it's probably a zero so don't output any sign 355:generalio.c **** 356:generalio.c **** PutDecByte((unsigned char)(abs(value))); 970 .LM122: 971 035a 8C2F mov r24,r28 972 035c 9927 clr r25 973 035e 87FD sbrc r24,7 974 0360 9095 com r25 975 0362 97FF sbrs r25,7 976 0364 03C0 rjmp .L97 977 0366 9095 com r25 978 0368 8195 neg r24 979 036a 9F4F sbci r25,lo8(-1) 980 .L97: 981 036c 0E94 0000 call PutDecByte 357:generalio.c **** } 983 .LM123: 984 /* epilogue: frame size=0 */ 985 0370 CF91 pop r28 986 0372 0895 ret 987 /* epilogue end (size=2) */ 988 /* function PutDecSignedByte size 24 (21) */ 990 .Lscope15: 994 .global PutDecSignedWord 996 PutDecSignedWord: 358:generalio.c **** 359:generalio.c **** // Function Name: PutDecSignedWord() 360:generalio.c **** // 361:generalio.c **** // Description: This function will format and send a SIGNED BYTE to the serial port in a decima 362:generalio.c **** // 363:generalio.c **** // 364:generalio.c **** void PutDecSignedWord(signed int value) 365:generalio.c **** { 998 .LM124: 999 /* prologue: frame size=0 */ 1000 0374 CF93 push r28 1001 0376 DF93 push r29 1002 /* prologue end (size=2) */ 1003 0378 EC01 movw r28,r24 366:generalio.c **** if (value > 0) 1005 .LM125: 1006 037a 1816 cp __zero_reg__,r24 1007 037c 1906 cpc __zero_reg__,r25 1008 037e 14F4 brge .L100 367:generalio.c **** PutChar('+'); 1010 .LM126: 1011 0380 8BE2 ldi r24,lo8(43) 1012 0382 03C0 rjmp .L104 1013 .L100: 368:generalio.c **** else 369:generalio.c **** if (value < 0) 1015 .LM127: 1016 0384 97FF sbrs r25,7 1017 0386 03C0 rjmp .L101 370:generalio.c **** PutChar('-'); 1019 .LM128: 1020 0388 8DE2 ldi r24,lo8(45) 1021 .L104: 1022 038a 0E94 0000 call PutChar 1023 .L101: 371:generalio.c **** 372:generalio.c **** // Otherwise it's probably a zero so don't output any sign 373:generalio.c **** PutDecWord((unsigned int)(abs(value))); 1025 .LM129: 1026 038e CE01 movw r24,r28 1027 0390 D7FF sbrs r29,7 1028 0392 03C0 rjmp .L103 1029 0394 9095 com r25 1030 0396 8195 neg r24 1031 0398 9F4F sbci r25,lo8(-1) 1032 .L103: 1033 039a 0E94 0000 call PutDecWord 374:generalio.c **** } 1035 .LM130: 1036 /* epilogue: frame size=0 */ 1037 039e DF91 pop r29 1038 03a0 CF91 pop r28 1039 03a2 0895 ret 1040 /* epilogue end (size=3) */ 1041 /* function PutDecSignedWord size 24 (19) */ 1043 .Lscope16: 1047 .global abs_byte 1049 abs_byte: 375:generalio.c **** 376:generalio.c **** 377:generalio.c **** // Function Name: abs_byte() 378:generalio.c **** // 379:generalio.c **** // Description: This function will return the absolute of the passed signed byte 380:generalio.c **** // 381:generalio.c **** // 382:generalio.c **** unsigned char abs_byte(signed char x) 383:generalio.c **** { 1051 .LM131: 1052 /* prologue: frame size=0 */ 1053 /* prologue end (size=0) */ 384:generalio.c **** if (x > 0) 1055 .LM132: 1056 03a4 1816 cp __zero_reg__,r24 1057 03a6 1CF0 brlt .L108 385:generalio.c **** return x; 1059 .LM133: 386:generalio.c **** 387:generalio.c **** if (x < 0) 1061 .LM134: 1062 03a8 87FF sbrs r24,7 1063 03aa 03C0 rjmp .L107 388:generalio.c **** return -x; 1065 .LM135: 1066 03ac 8195 neg r24 1067 .L108: 1068 03ae 9927 clr r25 389:generalio.c **** 390:generalio.c **** // Zero case. 391:generalio.c **** return 0; 392:generalio.c **** } 1070 .LM136: 1071 03b0 0895 ret 1072 .L107: 1074 .LM137: 1075 03b2 80E0 ldi r24,lo8(0) 1076 03b4 90E0 ldi r25,hi8(0) 1078 .LM138: 1079 03b6 0895 ret 1080 /* epilogue: frame size=0 */ 1081 03b8 0895 ret 1082 /* epilogue end (size=1) */ 1083 /* function abs_byte size 11 (10) */ 1085 .Lscope17: 1089 .global abs_word 1091 abs_word: 393:generalio.c **** 394:generalio.c **** // Function Name: abs_word() 395:generalio.c **** // 396:generalio.c **** // Description: This function will return the absolute of the passed signed word 397:generalio.c **** // 398:generalio.c **** // 399:generalio.c **** unsigned int abs_word(signed int x) 400:generalio.c **** { 1093 .LM139: 1094 /* prologue: frame size=0 */ 1095 /* prologue end (size=0) */ 401:generalio.c **** if (x > 0) 1097 .LM140: 1098 03ba 1816 cp __zero_reg__,r24 1099 03bc 1906 cpc __zero_reg__,r25 1100 03be 44F0 brlt .L109 402:generalio.c **** return x; 403:generalio.c **** 404:generalio.c **** if (x < 0) 1102 .LM141: 1103 03c0 97FF sbrs r25,7 1104 03c2 04C0 rjmp .L111 405:generalio.c **** return -x; 1106 .LM142: 1107 03c4 9095 com r25 1108 03c6 8195 neg r24 1109 03c8 9F4F sbci r25,lo8(-1) 406:generalio.c **** 407:generalio.c **** // Zero case. 408:generalio.c **** return 0; 409:generalio.c **** } 1111 .LM143: 1112 03ca 0895 ret 1113 .L111: 1115 .LM144: 1116 03cc 80E0 ldi r24,lo8(0) 1117 03ce 90E0 ldi r25,hi8(0) 1119 .LM145: 1120 .L109: 1121 03d0 0895 ret 1122 /* epilogue: frame size=0 */ 1123 03d2 0895 ret 1124 /* epilogue end (size=1) */ 1125 /* function abs_word size 13 (12) */ 1127 .Lscope18: 1131 .global PutBin 1133 PutBin: 410:generalio.c **** 411:generalio.c **** // Function Name: PutBin() 412:generalio.c **** // 413:generalio.c **** // Description: This function will format and send a byte to the serial port in a binary format 414:generalio.c **** // 415:generalio.c **** // 416:generalio.c **** void PutBin(unsigned char value) 417:generalio.c **** { 1135 .LM146: 1136 /* prologue: frame size=0 */ 1137 03d4 0F93 push r16 1138 03d6 1F93 push r17 1139 03d8 CF93 push r28 1140 /* prologue end (size=3) */ 1141 03da 082F mov r16,r24 418:generalio.c **** unsigned char i; 419:generalio.c **** unsigned char temp = 0x80; 1143 .LM147: 1144 .LBB10: 1145 03dc 10E8 ldi r17,lo8(-128) 420:generalio.c **** 421:generalio.c **** for (i = 0; i < 8 ; i++) 1147 .LM148: 1148 03de C0E0 ldi r28,lo8(0) 1149 .L119: 422:generalio.c **** { 423:generalio.c **** if (value & temp) 1151 .LM149: 1152 03e0 802F mov r24,r16 1153 03e2 8123 and r24,r17 1154 03e4 11F0 breq .L117 424:generalio.c **** PutChar('1'); 1156 .LM150: 1157 03e6 81E3 ldi r24,lo8(49) 1158 03e8 01C0 rjmp .L122 1159 .L117: 425:generalio.c **** else 426:generalio.c **** PutChar('0'); 1161 .LM151: 1162 03ea 80E3 ldi r24,lo8(48) 1163 .L122: 1164 03ec 0E94 0000 call PutChar 427:generalio.c **** temp = temp >> 1; 1166 .LM152: 1167 03f0 1695 lsr r17 1169 .LM153: 1170 03f2 CF5F subi r28,lo8(-(1)) 1171 03f4 C830 cpi r28,lo8(8) 1172 03f6 A0F3 brlo .L119 428:generalio.c **** } 429:generalio.c **** //PutChar('b'); 430:generalio.c **** } 1174 .LM154: 1175 .LBE10: 1176 /* epilogue: frame size=0 */ 1177 03f8 CF91 pop r28 1178 03fa 1F91 pop r17 1179 03fc 0F91 pop r16 1180 03fe 0895 ret 1181 /* epilogue end (size=4) */ 1182 /* function PutBin size 23 (16) */ 1188 .Lscope19: 1192 .global PutDecByte 1194 PutDecByte: 431:generalio.c **** 432:generalio.c **** 433:generalio.c **** // Function Name: PutDecByte() 434:generalio.c **** // 435:generalio.c **** // Description: This function will format and send a BYTE to the serial port in a decimal forma 436:generalio.c **** // 437:generalio.c **** // 438:generalio.c **** void PutDecByte(unsigned char value) 439:generalio.c **** { 1196 .LM155: 1197 /* prologue: frame size=0 */ 1198 0400 CF93 push r28 1199 /* prologue end (size=1) */ 1200 0402 C82F mov r28,r24 440:generalio.c **** unsigned char count = 0; 1202 .LM156: 1203 .LBB11: 1204 0404 80E0 ldi r24,lo8(0) 441:generalio.c **** 442:generalio.c **** // Special case 443:generalio.c **** if (value == 0) 1206 .LM157: 1207 0406 CC23 tst r28 1208 0408 11F4 brne .L124 444:generalio.c **** { 445:generalio.c **** PutChar('0'); 1210 .LM158: 1211 040a 80E3 ldi r24,lo8(48) 1212 040c 1DC0 rjmp .L141 1213 .L124: 446:generalio.c **** return; 447:generalio.c **** } 448:generalio.c **** 449:generalio.c **** /* how many hundreds? */ 450:generalio.c **** while (value > 99) 1215 .LM159: 1216 040e C436 cpi r28,lo8(100) 1217 0410 20F0 brlo .L138 1218 .L128: 451:generalio.c **** { 452:generalio.c **** value = value - 100; 1220 .LM160: 1221 0412 C456 subi r28,lo8(-(-100)) 453:generalio.c **** count++; 1223 .LM161: 1224 0414 8F5F subi r24,lo8(-(1)) 1225 0416 C436 cpi r28,lo8(100) 1226 0418 E0F7 brsh .L128 1227 .L138: 454:generalio.c **** } 455:generalio.c **** if (count != 0 || value == 0) // Remove leading 0s 1229 .LM162: 1230 041a 8823 tst r24 1231 041c 11F4 brne .L130 1232 041e CC23 tst r28 1233 0420 19F4 brne .L129 1234 .L130: 456:generalio.c **** PutChar('0' + count); 1236 .LM163: 1237 0422 805D subi r24,lo8(-(48)) 1238 0424 0E94 0000 call PutChar 1239 .L129: 457:generalio.c **** 458:generalio.c **** /* how many tens? */ 459:generalio.c **** count = 0; 1241 .LM164: 1242 0428 80E0 ldi r24,lo8(0) 460:generalio.c **** 461:generalio.c **** while (value > 9) 1244 .LM165: 1245 042a CA30 cpi r28,lo8(10) 1246 042c 20F0 brlo .L140 1247 .L134: 462:generalio.c **** { 463:generalio.c **** value = value - 10; 1249 .LM166: 1250 042e CA50 subi r28,lo8(-(-10)) 464:generalio.c **** count++; 1252 .LM167: 1253 0430 8F5F subi r24,lo8(-(1)) 1254 0432 CA30 cpi r28,lo8(10) 1255 0434 E0F7 brsh .L134 1256 .L140: 465:generalio.c **** } 466:generalio.c **** if (count != 0 || value == 0) // Remove leading 0s 1258 .LM168: 1259 0436 8823 tst r24 1260 0438 11F4 brne .L136 1261 043a CC23 tst r28 1262 043c 19F4 brne .L135 1263 .L136: 467:generalio.c **** PutChar('0' + count); 1265 .LM169: 1266 043e 805D subi r24,lo8(-(48)) 1267 0440 0E94 0000 call PutChar 1268 .L135: 468:generalio.c **** 469:generalio.c **** /* and finally units */ 470:generalio.c **** PutChar('0' + value); 1270 .LM170: 1271 0444 C05D subi r28,lo8(-(48)) 1272 0446 8C2F mov r24,r28 1273 .L141: 1274 0448 0E94 0000 call PutChar 471:generalio.c **** } 1276 .LM171: 1277 .LBE11: 1278 /* epilogue: frame size=0 */ 1279 044c CF91 pop r28 1280 044e 0895 ret 1281 /* epilogue end (size=2) */ 1282 /* function PutDecByte size 40 (37) */ 1287 .Lscope20: 1290 .global GetDecSignedWord 1292 GetDecSignedWord: 472:generalio.c **** 473:generalio.c **** // Function Name: GetDecSignedWord() 474:generalio.c **** // 475:generalio.c **** // Description: Reads in a signed 3 digit decimal number from the serial port 476:generalio.c **** // 477:generalio.c **** // 478:generalio.c **** int GetDecSignedWord(void) 479:generalio.c **** { 1294 .LM172: 1295 /* prologue: frame size=0 */ 1296 0450 FF92 push r15 1297 0452 0F93 push r16 1298 0454 1F93 push r17 1299 0456 CF93 push r28 1300 /* prologue end (size=4) */ 480:generalio.c **** #define PLUS 1 481:generalio.c **** #define MINUS 0 482:generalio.c **** 483:generalio.c **** 484:generalio.c **** int total = 0; 485:generalio.c **** unsigned char in; 486:generalio.c **** unsigned char sign; 487:generalio.c **** 488:generalio.c **** // Get sign. 489:generalio.c **** in = GetChar(); 1302 .LM173: 1303 .LBB12: 1304 0458 0E94 0000 call GetChar 1305 045c C82F mov r28,r24 490:generalio.c **** if (in == '-') 1307 .LM174: 1308 045e 8D32 cpi r24,lo8(45) 1309 0460 11F4 brne .L143 491:generalio.c **** { 492:generalio.c **** sign = MINUS; 1311 .LM175: 1312 0462 FF24 clr r15 493:generalio.c **** PutChar('-'); 1314 .LM176: 1315 0464 03C0 rjmp .L165 1316 .L143: 494:generalio.c **** } 495:generalio.c **** else 496:generalio.c **** { 497:generalio.c **** sign = PLUS; 1318 .LM177: 1319 0466 71E0 ldi r23,lo8(1) 1320 0468 F72E mov r15,r23 498:generalio.c **** PutChar('+'); 1322 .LM178: 1323 046a 8BE2 ldi r24,lo8(43) 1324 .L165: 1325 046c 0E94 0000 call PutChar 499:generalio.c **** } 500:generalio.c **** 501:generalio.c **** // Get valid digit for 100's 502:generalio.c **** 503:generalio.c **** //if (in == '-' || in =) 504:generalio.c **** //in = GetChar(); 505:generalio.c **** while ( in < '0' || in > '9') 1327 .LM179: 1328 0470 8C2F mov r24,r28 1329 0472 8053 subi r24,lo8(-(-48)) 1330 0474 8A30 cpi r24,lo8(10) 1331 0476 30F0 brlo .L160 1332 .L148: 506:generalio.c **** in = GetChar(); 1334 .LM180: 1335 0478 0E94 0000 call GetChar 1336 047c C82F mov r28,r24 1337 047e 8053 subi r24,lo8(-(-48)) 1338 0480 8A30 cpi r24,lo8(10) 1339 0482 D0F7 brsh .L148 1340 .L160: 507:generalio.c **** 508:generalio.c **** PutChar(in); 1342 .LM181: 1343 0484 8C2F mov r24,r28 1344 0486 0E94 0000 call PutChar 509:generalio.c **** 510:generalio.c **** total = (in - '0') * 100; 1346 .LM182: 1347 048a 84E6 ldi r24,lo8(100) 1348 048c C89F mul r28,r24 1349 048e 8001 movw r16,r0 1350 0490 1124 clr r1 1351 0492 005C subi r16,lo8(-(-4800)) 1352 0494 1241 sbci r17,hi8(-(-4800)) 511:generalio.c **** 512:generalio.c **** // Get valid digit for 10's 513:generalio.c **** 514:generalio.c **** in = GetChar(); 1354 .LM183: 1355 0496 0E94 0000 call GetChar 1356 049a C82F mov r28,r24 515:generalio.c **** while ( in < '0' || in > '9') 1358 .LM184: 1359 049c 8053 subi r24,lo8(-(-48)) 1360 049e 8A30 cpi r24,lo8(10) 1361 04a0 30F0 brlo .L162 1362 .L152: 516:generalio.c **** in = GetChar(); 1364 .LM185: 1365 04a2 0E94 0000 call GetChar 1366 04a6 C82F mov r28,r24 1367 04a8 8053 subi r24,lo8(-(-48)) 1368 04aa 8A30 cpi r24,lo8(10) 1369 04ac D0F7 brsh .L152 1370 .L162: 517:generalio.c **** 518:generalio.c **** PutChar(in); 1372 .LM186: 1373 04ae 8C2F mov r24,r28 1374 04b0 0E94 0000 call PutChar 519:generalio.c **** 520:generalio.c **** total += (in - '0') * 10; 1376 .LM187: 1377 04b4 8AE0 ldi r24,lo8(10) 1378 04b6 C89F mul r28,r24 1379 04b8 C001 movw r24,r0 1380 04ba 1124 clr r1 1381 04bc 080F add r16,r24 1382 04be 191F adc r17,r25 1383 04c0 005E subi r16,lo8(-(-480)) 1384 04c2 1140 sbci r17,hi8(-(-480)) 521:generalio.c **** 522:generalio.c **** // Get valid digit for 1's 523:generalio.c **** 524:generalio.c **** in = GetChar(); 1386 .LM188: 1387 04c4 0E94 0000 call GetChar 1388 04c8 C82F mov r28,r24 525:generalio.c **** while ( in < '0' || in > '9') 1390 .LM189: 1391 04ca 8053 subi r24,lo8(-(-48)) 1392 04cc 8A30 cpi r24,lo8(10) 1393 04ce 30F0 brlo .L164 1394 .L156: 526:generalio.c **** in = GetChar(); 1396 .LM190: 1397 04d0 0E94 0000 call GetChar 1398 04d4 C82F mov r28,r24 1399 04d6 8053 subi r24,lo8(-(-48)) 1400 04d8 8A30 cpi r24,lo8(10) 1401 04da D0F7 brsh .L156 1402 .L164: 527:generalio.c **** 528:generalio.c **** PutChar(in); 1404 .LM191: 1405 04dc 8C2F mov r24,r28 1406 04de 0E94 0000 call PutChar 529:generalio.c **** 530:generalio.c **** total += (in - '0'); 1408 .LM192: 1409 04e2 0C0F add r16,r28 1410 04e4 111D adc r17,__zero_reg__ 1411 04e6 0053 subi r16,lo8(-(-48)) 1412 04e8 1040 sbci r17,hi8(-(-48)) 531:generalio.c **** 532:generalio.c **** if (sign == MINUS) 1414 .LM193: 1415 04ea FF20 tst r15 1416 04ec 29F4 brne .L157 533:generalio.c **** return(-total); 1418 .LM194: 1419 04ee 8827 clr r24 1420 04f0 9927 clr r25 1421 04f2 801B sub r24,r16 1422 04f4 910B sbc r25,r17 1423 04f6 01C0 rjmp .L142 1424 .L157: 534:generalio.c **** else 535:generalio.c **** return(total); 1426 .LM195: 1427 04f8 C801 movw r24,r16 536:generalio.c **** } 1429 .LM196: 1430 .L142: 1431 .LBE12: 1432 /* epilogue: frame size=0 */ 1433 04fa CF91 pop r28 1434 04fc 1F91 pop r17 1435 04fe 0F91 pop r16 1436 0500 FF90 pop r15 1437 0502 0895 ret 1438 /* epilogue end (size=5) */ 1439 /* function GetDecSignedWord size 90 (81) */ 1446 .Lscope21: 1448 .text 1450 Letext: 1451 /* File "generalio.c": code 646 = 0x0286 ( 530), prologues 48, epilogues 68 */ DEFINED SYMBOLS *ABS*:00000000 generalio.c *ABS*:0000003f __SREG__ *ABS*:0000003e __SP_H__ *ABS*:0000003d __SP_L__ *ABS*:00000000 __tmp_reg__ *ABS*:00000001 __zero_reg__ C:\DOCUME~1\palm3\LOCALS~1\Temp/ccKSaaaa.s:73 .text:00000000 PrintString C:\DOCUME~1\palm3\LOCALS~1\Temp/ccKSaaaa.s:129 .text:00000024 _GetChar C:\DOCUME~1\palm3\LOCALS~1\Temp/ccKSaaaa.s:164 .text:00000038 GetHexWord C:\DOCUME~1\palm3\LOCALS~1\Temp/ccKSaaaa.s:230 .text:00000054 _GetHex C:\DOCUME~1\palm3\LOCALS~1\Temp/ccKSaaaa.s:185 .text:00000040 GetHexByte C:\DOCUME~1\palm3\LOCALS~1\Temp/ccKSaaaa.s:207 .text:0000004a GetHexChar C:\DOCUME~1\palm3\LOCALS~1\Temp/ccKSaaaa.s:362 .text:00000104 PutHexLong C:\DOCUME~1\palm3\LOCALS~1\Temp/ccKSaaaa.s:516 .text:00000196 _PutHex C:\DOCUME~1\palm3\LOCALS~1\Temp/ccKSaaaa.s:410 .text:0000013a PutHexWord C:\DOCUME~1\palm3\LOCALS~1\Temp/ccKSaaaa.s:446 .text:0000015a PutHexByte C:\DOCUME~1\palm3\LOCALS~1\Temp/ccKSaaaa.s:481 .text:00000178 PutHexChar C:\DOCUME~1\palm3\LOCALS~1\Temp/ccKSaaaa.s:614 .text:000001fc asciify C:\DOCUME~1\palm3\LOCALS~1\Temp/ccKSaaaa.s:588 .text:000001ee PutCRLF C:\DOCUME~1\palm3\LOCALS~1\Temp/ccKSaaaa.s:649 .text:0000020e GetDecWord C:\DOCUME~1\palm3\LOCALS~1\Temp/ccKSaaaa.s:769 .text:0000029a PutDecWord C:\DOCUME~1\palm3\LOCALS~1\Temp/ccKSaaaa.s:943 .text:00000344 PutDecSignedByte C:\DOCUME~1\palm3\LOCALS~1\Temp/ccKSaaaa.s:1194 .text:00000400 PutDecByte C:\DOCUME~1\palm3\LOCALS~1\Temp/ccKSaaaa.s:996 .text:00000374 PutDecSignedWord C:\DOCUME~1\palm3\LOCALS~1\Temp/ccKSaaaa.s:1049 .text:000003a4 abs_byte C:\DOCUME~1\palm3\LOCALS~1\Temp/ccKSaaaa.s:1091 .text:000003ba abs_word C:\DOCUME~1\palm3\LOCALS~1\Temp/ccKSaaaa.s:1133 .text:000003d4 PutBin C:\DOCUME~1\palm3\LOCALS~1\Temp/ccKSaaaa.s:1292 .text:00000450 GetDecSignedWord C:\DOCUME~1\palm3\LOCALS~1\Temp/ccKSaaaa.s:1450 .text:00000504 Letext *ABS*:00000000 *ABS* UNDEFINED SYMBOLS __do_copy_data __do_clear_bss PutChar GetChar isxdigit isalpha toupper atoi