156 lines
2.8 KiB
C
156 lines
2.8 KiB
C
|
#include <debugio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <stdarg.h>
|
||
|
#include <stdio.h>
|
||
|
|
||
|
extern uint8* VideoPtr;
|
||
|
|
||
|
extern UPoint ConsoleCursor;
|
||
|
extern UPoint ConsoleSize;
|
||
|
|
||
|
extern uint8 ConsoleDefaultColor;
|
||
|
|
||
|
/**************************************
|
||
|
* Write operations*
|
||
|
**************************************/
|
||
|
void _write_char(char c)
|
||
|
{
|
||
|
switch (c)
|
||
|
{
|
||
|
case '\n':
|
||
|
ConsoleCursorNewline(); break;
|
||
|
|
||
|
case '\r':
|
||
|
ConsoleCursor.X = 0; break;
|
||
|
|
||
|
case '\t':
|
||
|
ConsoleCursorIncreasePos(6 - ConsoleCursor.X % 6); break;
|
||
|
|
||
|
case '\b':
|
||
|
ConsoleCursorIncreasePos(-1);
|
||
|
VideoPtr[2 * (ConsoleCursor.Y * ConsoleSize.X + ConsoleCursor.X)] = 0;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
VideoPtr[2 * (ConsoleCursor.Y * ConsoleSize.X + ConsoleCursor.X)] = c;
|
||
|
VideoPtr[2 * (ConsoleCursor.Y * ConsoleSize.X + ConsoleCursor.X) + 1] = ConsoleDefaultColor;
|
||
|
|
||
|
ConsoleCursorIncreasePos(1);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void _write_string (string s)
|
||
|
{
|
||
|
int32 len = strlen(s), i;
|
||
|
|
||
|
for (i = 0; i < len; i++)
|
||
|
_write_char(s[i]);
|
||
|
}
|
||
|
|
||
|
|
||
|
void ConsoleWriteChar (char c)
|
||
|
{
|
||
|
_write_char(c);
|
||
|
ConsoleCursorUpdateHardware();
|
||
|
}
|
||
|
|
||
|
void ConsoleWriteString (string s)
|
||
|
{
|
||
|
_write_string(s);
|
||
|
ConsoleCursorUpdateHardware();
|
||
|
}
|
||
|
|
||
|
int32 ConsoleWrite (string format, ...)
|
||
|
{
|
||
|
if (!format || !*format) return 0;
|
||
|
|
||
|
va_list args;
|
||
|
va_start (args, format);
|
||
|
uint32 i, len = strlen(format);
|
||
|
|
||
|
uint8 temp_color = ConsoleDefaultColor;
|
||
|
|
||
|
for (i = 0; i < len; i++)
|
||
|
if (format[i] != '%') _write_char(format[i]);
|
||
|
else
|
||
|
{
|
||
|
++i;
|
||
|
switch (format[i]) {
|
||
|
// Character
|
||
|
case 'c': {
|
||
|
char c = va_arg (args, char);
|
||
|
_write_char(c);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// String
|
||
|
case 's': {
|
||
|
int32* c = (int32*) va_arg (args, string);
|
||
|
_write_string((string)c);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// Integers
|
||
|
case 'd':
|
||
|
case 'i': {
|
||
|
int32 c = va_arg(args, int32); char temp[32];
|
||
|
ConvertIntToString(temp, c, 10);
|
||
|
_write_string(temp);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// Integers - hex
|
||
|
case 'X':
|
||
|
case 'x': {
|
||
|
int32 c = va_arg(args, int32); char temp[32];
|
||
|
ConvertUIntToString(temp, c, 16);
|
||
|
_write_string(temp);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// Integers - unsigned
|
||
|
case 'u': {
|
||
|
int32 c = va_arg(args, uint32); char temp[32];
|
||
|
ConvertUIntToString (temp, c, 10);
|
||
|
_write_string(temp);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// Colors
|
||
|
case '#': {
|
||
|
uint8 c = va_arg(args, uint8);
|
||
|
ConsoleDefaultColor = c;
|
||
|
break; }
|
||
|
|
||
|
default: va_end(args); return 1;
|
||
|
};
|
||
|
}
|
||
|
|
||
|
va_end(args);
|
||
|
|
||
|
ConsoleDefaultColor = temp_color;
|
||
|
ConsoleCursorUpdateHardware();
|
||
|
return i;
|
||
|
}
|
||
|
|
||
|
void ConsoleSetChar(Point pos, char c)
|
||
|
{
|
||
|
VideoPtr[2 * (pos.Y * ConsoleSize.X + pos.X)] = c;
|
||
|
}
|
||
|
|
||
|
void ConsoleSetColor(Point pos, uint8 color)
|
||
|
{
|
||
|
VideoPtr[2 * (pos.Y * ConsoleSize.X + pos.X) + 1] = color;
|
||
|
}
|
||
|
|
||
|
char ConsoleGetChar(Point pos)
|
||
|
{
|
||
|
return (char)VideoPtr[2 * (pos.Y * ConsoleSize.X + pos.X)];
|
||
|
}
|
||
|
|
||
|
uint8 ConsoleGetColor (Point pos)
|
||
|
{
|
||
|
return VideoPtr[2 * (pos.Y * ConsoleSize.X + pos.X) + 1];
|
||
|
}
|