/* * CHU - driver for CH375 in disk mode * Copyright (C) 2024 Javier S. Pedro * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* Simple printf function for console, a bit wasteful for what it is used. * But it is part of the init code, so it will be thrown away. * dlog.h is more powerful but only in debug builds. */ #include #include #include #include #include "inc/dosapi.h" #include "cio.h" static inline void c_llputc(char c) { dos_print_char(c); } void c_utoa(unsigned num, unsigned base) { char buf[6]; int i = 0; do { unsigned digit = num % base; if (digit < 10) { buf[i] = '0' + digit; } else { buf[i] = 'a' + (digit - 10); } i++; num /= base; } while (num > 0 && i < sizeof(buf)); while (i--) { c_llputc(buf[i]); } } void c_itoa(int num, unsigned base) { unsigned unum; if (num < 0) { c_llputc('-'); unum = -num; } else { unum = num; } c_utoa(unum, base); } unsigned c_strtou(const char * *str) { unsigned i = 0; const char *s = *str; char c = *s; while (c >= '0' && c <= '9') { i = (i * 10) + (c - '0'); c = *(++s); } *str = s; return i; } static void c_printstr(const char *s) { while (*s) { c_llputc(*s++); } } void c_printf(const char *fmt, ...) { va_list va; char c; va_start(va, fmt); while ((c = *(fmt++))) { if (c == '%') { switch ((c = *(fmt++))) { case 'd': c_itoa(va_arg(va, int), 10); break; case 'u': c_utoa(va_arg(va, unsigned), 10); break; case 'x': case 'p': c_utoa(va_arg(va, unsigned), 16); break; case 's': c_printstr(va_arg(va, const char *)); break; case 'c': c_putc(va_arg(va, char)); break; case '%': c_llputc('%'); break; } } else { c_putc(c); } } va_end(va); } void c_putc(char c) { if (c == '\n') { c_llputc('\r'); } c_llputc(c); } void c_puts(const char *s) { char c; while ((c = *(s++))) { c_putc(c); } c_putc('\n'); }