📄 printf.c
字号:
mov a, @r0 mov r2, a dec r0 mov a, @r0 mov r1, a dec r0printf_get_done: ret /* convert binary number in r4/r3/r2/r1 into bcd packed number * in r3/r2/r7/r6/r5. The input number is destroyed in the * process, to avoid needing extra memory for the result (and * r1 gets used for temporary storage). dptr is overwritten, * but r0 is not changed. */printf_int2bcd:#if 1 mov a, r1 anl a, #0x0F mov dptr, #_int2bcd_0 movc a, @a+dptr mov r5, a mov a, r1 swap a anl a, #0x0F mov r1, a // recycle r1 for holding nibble mov dptr, #_int2bcd_1 movc a, @a+dptr add a, r5 da a mov r5, a mov a, r1 orl a, #16 movc a, @a+dptr addc a, #0 da a mov r6, a#else mov a, r1 mov b, #100 div ab mov r6, a mov b, a mov b, #10 div ab swap a orl a, b mov r5, a#endif jnb _short_flag, printf_i2bcd_16 // if 8 bit int, we're done retprintf_i2bcd_16: mov a, r2 anl a, #0x0F mov r1, a mov dptr, #_int2bcd_2 movc a, @a+dptr add a, r5 da a mov r5, a mov a, r1 orl a, #16 movc a, @a+dptr addc a, r6 da a mov r6, a mov a, r2 swap a anl a, #0x0F mov r1, a mov dptr, #_int2bcd_3 movc a, @a+dptr add a, r5 da a mov r5, a mov a, r1 orl a, #16 movc a, @a+dptr addc a, r6 da a mov r6, a mov a, r1 orl a, #32 movc a, @a+dptr addc a, #0 da a mov r7, a jb _long_flag, printf_i2bcd_32 // if 16 bit int, we're done retprintf_i2bcd_32:#ifdef LONG_INT mov a, r3 anl a, #0x0F mov r1, a mov dptr, #_int2bcd_4 movc a, @a+dptr add a, r5 da a mov r5, a mov a, r1 orl a, #16 movc a, @a+dptr addc a, r6 da a mov r6, a mov a, r1 orl a, #32 movc a, @a+dptr addc a, r7 da a mov r7, a clr a addc a, #0 mov r2, a mov a, r3 swap a anl a, #0x0F mov r1, a mov dptr, #_int2bcd_5 movc a, @a+dptr add a, r5 da a mov r5, a mov a, r1 orl a, #16 movc a, @a+dptr addc a, r6 da a mov r6, a mov a, r1 orl a, #32 movc a, @a+dptr addc a, r7 da a mov r7, a mov a, r1 orl a, #48 movc a, @a+dptr addc a, r2 da a mov r2, a mov a, r4 anl a, #0x0F mov r1, a mov dptr, #_int2bcd_6 mov r3, #0 lcall printf_bcd_add10 // saves 27 bytes, costs 5 cycles mov a, r4 swap a anl a, #0x0F mov r1, a mov dptr, #_int2bcd_7printf_bcd_add10: movc a, @a+dptr add a, r5 da a mov r5, a mov a, r1 orl a, #16 movc a, @a+dptr addc a, r6 da a mov r6, a mov a, r1 orl a, #32 movc a, @a+dptr addc a, r7 da a mov r7, a mov a, r1 orl a, #48 movc a, @a+dptr addc a, r2 da a mov r2, a mov a, r1 orl a, #64 movc a, @a+dptr addc a, r3 da a mov r3, a#endif ret#ifdef FIELD_WIDTHprintf_space_loop: //mov a, #' ' mov a, #32 lcall printf_putchar dec _field_widthprintf_space: mov a, _field_width jnz printf_space_loop ret#endif /* print a hex digit, either upper 4 bit (msn) or lower 4 bits (lsn) */printf_phex_msn: swap aprintf_phex_lsn: anl a, #15 jnz printf_phex_ok jnb _print_zero_flag, printf_retprintf_phex_ok: setb _print_zero_flag add a, #0x90 da a addc a, #0x40 da aprintf_putchar: ljmp COUT ;push dph ;push dpl ;push ar0 ;mov dpl, a ;lcall _putchar ;pop ar0 ;pop dpl ;pop dphprintf_ret: ret /* print a zero if all the calls to print the digits ended up */ /* being leading zeros */printf_zero: jb _print_zero_flag, printf_ret //mov a, #'0' mov a, #48 ljmp printf_putchar printf_end: _endasm;}/* * #! /usr/bin/perl * for ($d=0; $d < 8; $d++) { * $n = 16 ** $d; * for ($p=0; $p < 5; $p++) { * last unless (((16 ** $d) * 15) / (10 ** ($p * 2))) % 100; * printf "code unsigned char int2bcd_%d_%d[15] = {", $d, $p; * for ($i=0; $i < 16; $i++) { * printf "0x%02d", * (((16 ** $d) * $i) / (10 ** ($p * 2))) % 100; * print ", " if $i < 15; * } * print "};\n"; * } * } */code unsigned char int2bcd_0[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15};code unsigned char int2bcd_1[] = {0x00, 0x16, 0x32, 0x48, 0x64, 0x80, 0x96, 0x12,0x28, 0x44, 0x60, 0x76, 0x92, 0x08, 0x24, 0x40,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02};code unsigned char int2bcd_2[] = {0x00, 0x56, 0x12, 0x68, 0x24, 0x80, 0x36, 0x92,0x48, 0x04, 0x60, 0x16, 0x72, 0x28, 0x84, 0x40,0x00, 0x02, 0x05, 0x07, 0x10, 0x12, 0x15, 0x17,0x20, 0x23, 0x25, 0x28, 0x30, 0x33, 0x35, 0x38};code unsigned char int2bcd_3[] = {0x00, 0x96, 0x92, 0x88, 0x84, 0x80, 0x76, 0x72,0x68, 0x64, 0x60, 0x56, 0x52, 0x48, 0x44, 0x40,0x00, 0x40, 0x81, 0x22, 0x63, 0x04, 0x45, 0x86,0x27, 0x68, 0x09, 0x50, 0x91, 0x32, 0x73, 0x14,0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02,0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x06};#ifdef LONG_INTcode unsigned char int2bcd_4[] = {0x00, 0x36, 0x72, 0x08, 0x44, 0x80, 0x16, 0x52,0x88, 0x24, 0x60, 0x96, 0x32, 0x68, 0x04, 0x40,0x00, 0x55, 0x10, 0x66, 0x21, 0x76, 0x32, 0x87,0x42, 0x98, 0x53, 0x08, 0x64, 0x19, 0x75, 0x30,0x00, 0x06, 0x13, 0x19, 0x26, 0x32, 0x39, 0x45,0x52, 0x58, 0x65, 0x72, 0x78, 0x85, 0x91, 0x98};code unsigned char int2bcd_5[] = {0x00, 0x76, 0x52, 0x28, 0x04, 0x80, 0x56, 0x32,0x08, 0x84, 0x60, 0x36, 0x12, 0x88, 0x64, 0x40,0x00, 0x85, 0x71, 0x57, 0x43, 0x28, 0x14, 0x00,0x86, 0x71, 0x57, 0x43, 0x29, 0x14, 0x00, 0x86,0x00, 0x04, 0x09, 0x14, 0x19, 0x24, 0x29, 0x34,0x38, 0x43, 0x48, 0x53, 0x58, 0x63, 0x68, 0x72,0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15};code unsigned char int2bcd_6[] = {0x00, 0x16, 0x32, 0x48, 0x64, 0x80, 0x96, 0x12,0x28, 0x44, 0x60, 0x76, 0x92, 0x08, 0x24, 0x40,0x00, 0x72, 0x44, 0x16, 0x88, 0x60, 0x32, 0x05,0x77, 0x49, 0x21, 0x93, 0x65, 0x38, 0x10, 0x82,0x00, 0x77, 0x55, 0x33, 0x10, 0x88, 0x66, 0x44,0x21, 0x99, 0x77, 0x54, 0x32, 0x10, 0x88, 0x65,0x00, 0x16, 0x33, 0x50, 0x67, 0x83, 0x00, 0x17,0x34, 0x50, 0x67, 0x84, 0x01, 0x18, 0x34, 0x51,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02};code unsigned char int2bcd_7[] = {0x00, 0x56, 0x12, 0x68, 0x24, 0x80, 0x36, 0x92,0x48, 0x04, 0x60, 0x16, 0x72, 0x28, 0x84, 0x40,0x00, 0x54, 0x09, 0x63, 0x18, 0x72, 0x27, 0x81,0x36, 0x91, 0x45, 0x00, 0x54, 0x09, 0x63, 0x18,0x00, 0x43, 0x87, 0x30, 0x74, 0x17, 0x61, 0x04,0x48, 0x91, 0x35, 0x79, 0x22, 0x66, 0x09, 0x53,0x00, 0x68, 0x36, 0x05, 0x73, 0x42, 0x10, 0x79,0x47, 0x15, 0x84, 0x52, 0x21, 0x89, 0x58, 0x26,0x00, 0x02, 0x05, 0x08, 0x10, 0x13, 0x16, 0x18,0x21, 0x24, 0x26, 0x29, 0x32, 0x34, 0x37, 0x40};#endifvoid print(code char *str){ str; _asmprint_loop: clr a movc a, @a+dptr jz print_end lcall COUT inc dptr sjmp print_loopprint_end: _endasm;}void print_str(xdata char *str){ str; _asmprint_str_loop: movx a, @dptr jz print_str_end lcall COUT inc dptr sjmp print_str_loopprint_str_end: mov a, #32 ljmp COUT _endasm;}void print_str_n_asm(xdata char *str){ str; _asmprint_strn_loop: movx a, @dptr jz print_strn_loop2 lcall COUT inc dptr djnz _strcpy_asm_src_addr, print_strn_loop retprint_strn_loop2: mov a, #32 lcall COUT djnz _strcpy_asm_src_addr, print_strn_loop2 _endasm;}void print_hex32(unsigned long ul){ ul; _asm setb _print_zero_flag push acc lcall printf_phex_msn pop acc lcall printf_phex_lsn mov a, b lcall printf_phex_msn mov a, b lcall printf_phex_lsnprint_h16: mov a, dph lcall printf_phex_msn mov a, dph lcall printf_phex_lsn mov a, dpl lcall printf_phex_msn mov a, dpl lcall printf_phex_lsn mov a, #32 ljmp COUT _endasm;}void print_hex16(unsigned int ui){ ui; _asm setb _print_zero_flag ljmp print_h16 _endasm;}void print_uint8(unsigned char c){ c; _asm clr _print_zero_flag mov a, dpl mov b, #100 div ab jz 00001$ add a, #0x30 lcall COUT setb _print_zero_flag00001$: mov a, b mov b, #10 div ab jnz 00002$ jnb _print_zero_flag, 00003$00002$: add a, #0x30 lcall COUT00003$: mov a, b add a, #0x30 lcall COUT mov a, #32 ljmp COUT _endasm;}void print_char(char c){ c; _asm mov a, dpl ljmp COUT _endasm;}void print_crlf(void){ _asm mov a, #13 lcall COUT mov a, #10 ljmp COUT _endasm;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -