I got tired of banging my head against the wall with the toolchain compiling. So I decided to just work on something else for a while.
This morning, I connected the
CTS
and
RTS
to the RS232 port. So, I’ll start to see if I can do hardware flow control. Which I want since I have 1) a slow processor, 2) a limited 8 byte FIFO in the MAX3110E, and 3) a plan to run at the maximum baud rate. I still have to tie the
IRQ
to the CPU. Then I’ll be done with communication connections.
I also am working on the parts of the C library that are missing while I’m not getting the toolchain to compile. Since the printf formatting has all kinds of stuff in it, I am just going to write my own minimal formatter. It won’t do everything, but it will do everything I need. No floating point or long long.
I also wrote some test code so I know that it works. At least well enough for now–with correct input.
1 // Formatter for printf, sprintf, vprintf, vsprintf, etc.
2 // This is a very light and minimal formatter that includes only
3 // a subset of the standard functionality. This list explains what
4 // this light version is capable of:
5 // %c - print character
6 // %s - print string
7 // %% - print '%'
8 // %d - print signed int
9 // %x - print unsigned int in hex
10 // %p - print 2 byte unsigned pointer in hex
11 // %#[xduls] - print and pad to # characters. If # starts with 0, use
12 // leading zeros on unsigned int/long
13 // %-#[sulds] - as above, but right justify
14 // %l[xd] - 4 byte long instead of 2 byte int
15 // %u[xd] - unsigned
16
17 void print_int ( uint32_t data , int base , bool isUnsigned , bool leadingZeroes , int size , int length , bool rightJustify , char ** pBuffer , void ( * write )( char c , char ** pBuffer ))
18 {
19 char buf [ BUFLEN ];
20 static const char * ascii = "0123456789abcdef" ;
21 int i = BUFLEN - 1 ;
22 bool negSign = false ;
23 uint32_t udata = data ;
24 if ( ! isUnsigned && (( int32_t ) data ) < 0 )
25 {
26 negSign = true ;
27 udata = ( ~ data ) + 1 ;
28 }
29 if ( size == 2 )
30 {
31 udata &= 0xffff ;
32 }
33 do
34 {
35 buf [ i -- ] = ascii [ udata % base ];
36 udata = udata / base ;
37 } while ( udata != 0 );
38
39 if ( negSign )
40 {
41 buf [ i -- ] = '-' ;
42 }
43 while ( i >= 0 && length > ( BUFLEN - i ))
44 {
45 buf [ i -- ] = leadingZeroes ? '0' : ' ' ;
46 }
47 i ++ ; // move to the valid data
48 for (; i < BUFLEN ; i ++ )
49 {
50 write ( buf [ i ], pBuffer );
51 }
52 }
53
54 int print_format ( void ( * write )( char c , char ** pBuffer ), char ** pBuffer , const char * format , va_list ap )
55 {
56 char c ;
57 char * start = * pBuffer ;
58 int16_t len ;
59 bool isunsigned ;
60 int16_t base ;
61 bool leadingZero ;
62 bool neg ;
63 int16_t padding ;
64 long data ;
65 char * p ;
66 int i ;
67
68 // while not at end of line
69 while ( c = * format ++ )
70 {
71 if ( c != '%' )
72 {
73 write ( c , pBuffer );
74 }
75 else
76 {
77 bool done = false ;
78 len = 2 ;
79 isunsigned = false ;
80 leadingZero = false ;
81 neg = false ;
82 padding = 0 ;
83 while ( ! done )
84 {
85 c = * format ++ ;
86 switch ( c )
87 {
88 case '%' :
89 write ( c , pBuffer );
90 done = true ;
91 break ;
92 case 's' :
93 // get ptr from va_list
94 p = va_arg ( ap , char * );
95 if ( padding > 0 )
96 {
97 int slen = strlen ( p );
98 int spaces = padding - slen ;
99 if ( spaces > 0 )
100 {
101 // padded string
102 if ( neg )
103 {
104 for ( i = 0 ; i < spaces ; i ++ )
105 {
106 write ( ' ' , pBuffer );
107 }
108 }
109
110 while ( c = * p )
111 {
112 write ( c , pBuffer );
113 }
114
115 if ( ! neg )
116 {
117 for ( i = 0 ; i < spaces ; i ++ )
118 {
119 write ( ' ' , pBuffer );
120 }
121 }
122 }
123 else
124 {
125 // string longer than padding
126 while ( c = * p )
127 {
128 write ( c , pBuffer );
129 }
130 }
131 }
132 else
133 {
134 while ( c = * p )
135 {
136 write ( c , pBuffer );
137 }
138 }
139 done = true ;
140 break ;
141 case 'c' :
142 c = va_arg ( ap , int ); // char is promoted to int
143 write ( c , pBuffer );
144 done = true ;
145 break ;
146 case 'h' :
147 len = 2 ;
148 break ;
149 case 'u' :
150 isunsigned = true ;
151 break ;
152 case 'l' :
153 len = 4 ;
154 break ;
155 case '-' :
156 neg = true ;
157 break ;
158 case '0' :
159 if ( ! padding )
160 {
161 // if no padding yet, then this means leading zeroes are shown
162 leadingZero = true ;
163 }
164 // fall through
165 case '1' :
166 case '2' :
167 case '3' :
168 case '4' :
169 case '5' :
170 case '6' :
171 case '7' :
172 case '8' :
173 case '9' :
174 padding = padding * 10 + c - '0' ;
175 break ;
176 case 'p' :
177 isunsigned = true ;
178 len = 2 ;
179 case 'd' :
180 case 'x' :
181 base = c == 'd' ? 10 : 16 ; // 16 on x or p
182 if ( len == 4 )
183 {
184 data = va_arg ( ap , long );
185 }
186 else
187 {
188 data = va_arg ( ap , int );
189 }
190 print_int ( data , base , isunsigned , leadingZero , len , padding , neg , pBuffer , write );
191 done = true ;
192 break ;
193 }
194 }
195 }
196 }
197 ** pBuffer = '\0' ;
198 return * pBuffer - start ;
199 }