7 _putint_helper(char **dst
, unsigned *size
, unsigned long d
, unsigned long radix
)
10 unsigned long radix10
= radix
* 10;
13 d
= _putint_helper(dst
, size
, d
, radix10
);
15 for (k
= 0; k
< 10 && d
>= radix
; ++k
)
28 int _putint(char **dst
, unsigned *size
, long d
)
34 *(*dst
)++ = '-', (*size
)--, d
= -d
;
36 return _putint_helper(dst
, size
, d
, 1);
39 int _puthex(char **dst
, unsigned *size
, int d
, unsigned long v
)
42 if (_puthex(dst
, size
, d
- 1, v
>> 4) == -1)
45 *(*dst
)++ = "0123456789abcdef"[v
& 15];
51 int my_vsnprintf(char *str
, unsigned size
, char *format
, long *args
)
53 // XXX varargs anyone?
57 --size
; // Reserve space for a terminating zero
59 for (; *format
; ++format
)
62 else if (*format
!= '%') {
66 long unsigned fieldsize
= 0;
67 long unsigned leading_zero
= 0;
71 ++format
, leading_zero
= 1;
73 while ('0' <= *format
&& *format
<= '9')
74 fieldsize
= fieldsize
* 10 + *format
++ - '0';
80 _putint(&str
, &size
, *args
);
88 _puthex(&str
, &size
, fieldsize
, *args
);
94 for (s
= (char *) *args
; *s
&& size
; ++s
, ++str
, --size
)
103 return str
- orig_str
;
106 static void serial_out(int ch
)
108 // XXX Replace this with an interrupt driven version
113 while (MMIX_IOSPACE
[1])
115 MMIX_IOSPACE
[0] = ch
;
118 void write(int fd
, char *buf
, int n
)
121 for (; n
; --n
, ++buf
)
127 int mmix_fprintf(int fd
, char *format
, long arg1
, ...)
129 char buf
[9999]; /// XXX use a dynamic buffer
130 int len
= my_vsnprintf(buf
, sizeof buf
, format
, &arg1
); // XXX varargs anyone?
135 int mmix_printf(char *format
, long arg1
, ...)
137 char buf
[9999]; /// XXX use a dynamic buffer
138 int len
= my_vsnprintf(buf
, sizeof buf
, format
, &arg1
); // XXX varargs anyone?
139 write(stdout
, buf
, len
);
145 void wait_ms(long unsigned ms
) {
146 long unsigned start
= now();
147 long cycles
= 25000 * ms
;
149 while (now() - start
< cycles
)
153 void wait_us(long unsigned us
) {
154 long unsigned start
= now();
155 long cycles
= 25 * us
;
157 while (now() - start
< cycles
)