Aucune description

agb_debug.c 5.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. /****************************************************************************
  2. * Copyright (C) 2015-2017 by the SotS Team *
  3. * *
  4. * This file is part of Sovereign of the Skies. *
  5. * *
  6. * Sovereign of the Skies is free software: you can redistribute it *
  7. * and/or modify it *
  8. * under the terms of the GNU Lesser General Public License as published *
  9. * by the Free Software Foundation, either version 3 of the License, or *
  10. * (at your option) any later version provided you include a copy of the *
  11. * licence and this header. *
  12. * *
  13. * Sovereign of the Skies is distributed in the hope that it will be *
  14. * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of *
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
  16. * GNU Lesser General Public License for more details. *
  17. * *
  18. * You should have received a copy of the GNU Lesser General Public *
  19. * License along with Sovereign of the Skies. *
  20. * If not, see <http://www.gnu.org/licenses/>. *
  21. ****************************************************************************/
  22. /*
  23. * File: agb_debug.c
  24. * Author: Sturmvogel
  25. *
  26. * Created on 11. April 2017, 04:55
  27. */
  28. #include <memory.h>
  29. #include <stdarg.h>
  30. #include <math.h>
  31. void dprint(const char * sz)
  32. {
  33. __asm__ __volatile__(
  34. "mov r2, %0\n"
  35. "mov r0, #0xC0\n"
  36. "lsl r0, #0x8\n"
  37. "mov r1, #0xDE\n"
  38. "orr r0, r1\n"
  39. "lsl r0, #0x8\n"
  40. "mov r1, #0xD0\n"
  41. "orr r0, r1\n"
  42. "lsl r0, #8\n"
  43. "mov r1, #0x0D\n"
  44. "orr r0, r1\n"
  45. "mov r1, #0\n"
  46. "and r0, r0, r0\n":
  47. :
  48. "r" (sz):
  49. "r0", "r1", "r2");
  50. }
  51. u32 mini_strlen(const char * s) {
  52. u32 len = 0;
  53. while (s[len] != '\0') len++;
  54. return len;
  55. }
  56. u32 mini_itoa(int value, u32 radix, u32 uppercase, u32 unsig, char * buffer, u32 zero_pad) {
  57. char * pbuffer = buffer;
  58. s32 negative = 0;
  59. u32 i, len;
  60. /* No support for unusual radixes. */
  61. if (radix > 16)
  62. return 0;
  63. if (value < 0 && !unsig) {
  64. negative = 1;
  65. value = -value;
  66. }
  67. /* This builds the string back to front ... */
  68. do {
  69. u32 digit = value % radix;
  70. * (pbuffer++) = (digit < 10 ? '0' + digit : (uppercase ? 'A' : 'a') + digit - 10);
  71. value /= radix;
  72. } while (value > 0);
  73. for (i = (pbuffer - buffer); i < zero_pad; i++)
  74. * (pbuffer++) = '0';
  75. if (negative)
  76. {
  77. * (pbuffer++) = '-'; * (pbuffer) = '\0';
  78. }
  79. /* ... now we reverse it (could do it recursively but will
  80. * conserve the stack space) */
  81. len = (pbuffer - buffer);
  82. for (i = 0; i < len / 2; i++) {
  83. char j = buffer[i];
  84. buffer[i] = buffer[len - i - 1];
  85. buffer[len - i - 1] = j;
  86. }
  87. return len;
  88. }
  89. int mini_vsnprintf(char * buffer, u32 buffer_len,
  90. const char * fmt, va_list va)
  91. {
  92. char * pbuffer = buffer;
  93. char bf[24];
  94. char ch;
  95. int _putc(char ch)
  96. {
  97. if ((u32)((pbuffer - buffer) + 1) >= buffer_len)
  98. return 0;
  99. * (pbuffer++) = ch;
  100. * (pbuffer) = '\0';
  101. return 1;
  102. }
  103. int _puts(char * s, u32 len)
  104. {
  105. u32 i;
  106. if (buffer_len - (pbuffer - buffer) - 1 < len)
  107. len = buffer_len - (pbuffer - buffer) - 1;
  108. /* Copy to buffer */
  109. for (i = 0; i < len; i++)
  110. * (pbuffer++) = s[i];
  111. * (pbuffer) = '\0';
  112. return len;
  113. }
  114. while ((ch = * (fmt++))) {
  115. if ((u32)((pbuffer - buffer) + 1) >= buffer_len)
  116. break;
  117. if (ch != '%')
  118. _putc(ch);
  119. else {
  120. char zero_pad = 0;
  121. char * ptr;
  122. u32 len;
  123. ch = * (fmt++);
  124. /* Zero padding requested */
  125. if (ch == '0') {
  126. ch = * (fmt++);
  127. if (ch == '\0')
  128. return pbuffer - buffer;
  129. if (ch >= '0' && ch <= '9')
  130. zero_pad = ch - '0';
  131. ch = * (fmt++);
  132. }
  133. switch (ch) {
  134. case 0:
  135. return pbuffer - buffer;
  136. case 'u':
  137. case 'd':
  138. len = mini_itoa(va_arg(va, u32), 10, 0, (ch == 'u'), bf, zero_pad);
  139. _puts(bf, len);
  140. break;
  141. case 'x':
  142. case 'X':
  143. len = mini_itoa(va_arg(va, u32), 16, (ch == 'X'), 1, bf, zero_pad);
  144. _puts(bf, len);
  145. break;
  146. case 'c':
  147. _putc((char)(va_arg(va, int)));
  148. break;
  149. case 's':
  150. ptr = va_arg(va, char * );
  151. _puts(ptr, mini_strlen(ptr));
  152. break;
  153. default:
  154. _putc(ch);
  155. break;
  156. }
  157. }
  158. }
  159. return pbuffer - buffer;
  160. }
  161. void dprintf(const char * str, ...)
  162. {
  163. char* __outstr = malloc(256);
  164. va_list args;
  165. va_start(args, str);
  166. mini_vsnprintf(__outstr, 256, str, args);
  167. va_end(args);
  168. dprint(__outstr);
  169. free(__outstr);
  170. }