Start of implementation for the console. dprintf() now uses one of the console handles for simplicity.
It crashes for now though, seems we have a stack alignment issue or maybe mangled registers. Or maybe it's due to non-static initializers not being done. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39053 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -15,10 +15,77 @@
|
|||||||
#include "console.h"
|
#include "console.h"
|
||||||
#include "keyboard.h"
|
#include "keyboard.h"
|
||||||
|
|
||||||
|
class ConsoleHandle : public CharHandle {
|
||||||
|
public:
|
||||||
|
ConsoleHandle();
|
||||||
|
|
||||||
FILE *stdin, *stdout, *stderr;
|
virtual ssize_t ReadAt(void *cookie, off_t pos, void *buffer,
|
||||||
|
size_t bufferSize);
|
||||||
|
virtual ssize_t WriteAt(void *cookie, off_t pos, const void *buffer,
|
||||||
|
size_t bufferSize);
|
||||||
|
private:
|
||||||
|
static int16 fX;
|
||||||
|
static int16 fY;
|
||||||
|
uint16 fPen;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static Screen *sScreen;
|
||||||
|
static int16 sFontWidth, sFontHeight;
|
||||||
|
int16 ConsoleHandle::fX = 0;
|
||||||
|
int16 ConsoleHandle::fY = 0;
|
||||||
|
|
||||||
|
FILE *stdin, *stdout, *stderr, *dbgerr;
|
||||||
|
|
||||||
|
|
||||||
|
// #pragma mark -
|
||||||
|
|
||||||
|
ConsoleHandle::ConsoleHandle()
|
||||||
|
: CharHandle()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ssize_t
|
||||||
|
ConsoleHandle::ReadAt(void */*cookie*/, off_t /*pos*/, void *buffer,
|
||||||
|
size_t bufferSize)
|
||||||
|
{
|
||||||
|
// don't seek in character devices
|
||||||
|
// not implemented (and not yet? needed)
|
||||||
|
return B_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ssize_t
|
||||||
|
ConsoleHandle::WriteAt(void */*cookie*/, off_t /*pos*/, const void *buffer,
|
||||||
|
size_t bufferSize)
|
||||||
|
{
|
||||||
|
const char *string = (const char *)buffer;
|
||||||
|
size_t i, len;
|
||||||
|
|
||||||
|
// be nice to our audience and replace single "\n" with "\r\n"
|
||||||
|
|
||||||
|
for (i = 0, len = 0; i < bufferSize; i++, len++) {
|
||||||
|
if (string[i] == '\0')
|
||||||
|
break;
|
||||||
|
if (string[i] == '\n') {
|
||||||
|
//Text(&sScreen->RastPort, &string[i - len], len);
|
||||||
|
fY = 0;
|
||||||
|
fX++;
|
||||||
|
len = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Text(&sScreen->RastPort, &string[i], 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// not exactly, but we don't care...
|
||||||
|
return bufferSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ConsoleHandle sOutput;
|
||||||
|
static ConsoleHandle sErrorOutput;
|
||||||
|
static ConsoleHandle sDebugOutput;
|
||||||
|
|
||||||
|
|
||||||
// #pragma mark -
|
// #pragma mark -
|
||||||
|
|
||||||
@@ -26,7 +93,64 @@ FILE *stdin, *stdout, *stderr;
|
|||||||
status_t
|
status_t
|
||||||
console_init(void)
|
console_init(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
GRAPHICS_BASE_NAME = (GfxBase *)OldOpenLibrary(GRAPHICSNAME);
|
||||||
|
if (GRAPHICS_BASE_NAME == NULL)
|
||||||
|
panic("Cannot open %s", GRAPHICSNAME);
|
||||||
|
|
||||||
|
static NewScreen newScreen = {
|
||||||
|
0, 0,
|
||||||
|
640, -1,
|
||||||
|
2,
|
||||||
|
0, 1,
|
||||||
|
0x8000,
|
||||||
|
0x1,
|
||||||
|
NULL,
|
||||||
|
"Haiku Loader",
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
sScreen = OpenScreen(&newScreen);
|
||||||
|
if (sScreen == NULL)
|
||||||
|
panic("OpenScreen()\n");
|
||||||
|
|
||||||
|
static const uint16 palette[] = {0xbb9, 0x0, 0xfff, 0x0f0};
|
||||||
|
LoadRGB4(&sScreen->ViewPort, palette, 4);
|
||||||
|
|
||||||
|
SetDrMd(&sScreen->RastPort, 0);
|
||||||
|
// seems not necessary, there is a default font already set.
|
||||||
|
/*
|
||||||
|
TextAttr attrs = { "Topaz", 8, 0, 0};
|
||||||
|
TextFont *font = OpenFont(&attrs);
|
||||||
|
*/
|
||||||
|
TextFont *font = OpenFont(sScreen->Font);
|
||||||
|
if (font == NULL)
|
||||||
|
panic("OpenFont()\n");
|
||||||
|
sFontHeight = sScreen->Font->ta_YSize;
|
||||||
|
sFontWidth = font->tf_XSize;
|
||||||
|
|
||||||
|
|
||||||
|
ClearScreen(&sScreen->RastPort);
|
||||||
|
|
||||||
|
//CloseScreen(sScreen);
|
||||||
|
|
||||||
//TODO
|
//TODO
|
||||||
|
|
||||||
|
dbgerr = stdout = stderr = (FILE *)&sOutput;
|
||||||
|
|
||||||
|
//XXX: testing
|
||||||
|
Move(&sScreen->RastPort, 30, 30);
|
||||||
|
Text(&sScreen->RastPort, "kikou", 5);
|
||||||
|
|
||||||
|
// those crash for the moment. Stack alignment issue ?
|
||||||
|
// sOutput.WriteAt(NULL, 0LL, "abcdefgh", 10);
|
||||||
|
// dprintf("kk\nbb\n");
|
||||||
|
|
||||||
|
//XXX
|
||||||
|
while (true) {}
|
||||||
|
|
||||||
|
//panic("console_init done\n");
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
@@ -38,7 +162,7 @@ console_init(void)
|
|||||||
void
|
void
|
||||||
console_clear_screen(void)
|
console_clear_screen(void)
|
||||||
{
|
{
|
||||||
//TODO
|
ClearScreen(&sScreen->RastPort);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -61,7 +185,8 @@ console_height(void)
|
|||||||
void
|
void
|
||||||
console_set_cursor(int32 x, int32 y)
|
console_set_cursor(int32 x, int32 y)
|
||||||
{
|
{
|
||||||
//TODO
|
Move(&sScreen->RastPort, sFontWidth * x, sFontHeight * y);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,9 @@
|
|||||||
|
|
||||||
#include "keyboard.h"
|
#include "keyboard.h"
|
||||||
#include "rom_calls.h"
|
#include "rom_calls.h"
|
||||||
|
#include "Handle.h"
|
||||||
|
#include "console.h"
|
||||||
|
#include "keyboard.h"
|
||||||
|
|
||||||
#include <boot/platform.h>
|
#include <boot/platform.h>
|
||||||
#include <boot/stdio.h>
|
#include <boot/stdio.h>
|
||||||
@@ -14,6 +17,8 @@
|
|||||||
|
|
||||||
#include <Errors.h>
|
#include <Errors.h>
|
||||||
|
|
||||||
|
extern FILE *dbgerr;
|
||||||
|
|
||||||
/*! This works only after console_init() was called.
|
/*! This works only after console_init() was called.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
@@ -60,38 +65,17 @@ panic(const char *format, ...)
|
|||||||
void
|
void
|
||||||
dprintf(const char *format, ...)
|
dprintf(const char *format, ...)
|
||||||
{
|
{
|
||||||
static struct AlertMessage {
|
char buffer[512];
|
||||||
uint16 column1;
|
|
||||||
uint8 line1;
|
|
||||||
char message[14];
|
|
||||||
uint8 cont;
|
|
||||||
uint16 column2;
|
|
||||||
uint8 line2;
|
|
||||||
char buffer[512];
|
|
||||||
uint8 end;
|
|
||||||
|
|
||||||
} _PACKED alert = {
|
|
||||||
10, 12,
|
|
||||||
"KERN: ",
|
|
||||||
1,
|
|
||||||
10, 22,
|
|
||||||
"",
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
char *buffer = alert.buffer;
|
|
||||||
va_list list;
|
va_list list;
|
||||||
|
|
||||||
//platform_switch_to_text_mode();
|
//platform_switch_to_text_mode();
|
||||||
|
|
||||||
memset(buffer, 0, 512);
|
|
||||||
|
|
||||||
va_start(list, format);
|
va_start(list, format);
|
||||||
vsnprintf(buffer, 512, format, list);
|
if (dbgerr)
|
||||||
|
vfprintf(dbgerr, format, list);
|
||||||
|
//vsnprintf(buffer, sizeof(buffer), format, list);
|
||||||
va_end(list);
|
va_end(list);
|
||||||
|
|
||||||
DisplayAlert(RECOVERY_ALERT, &alert, 40);
|
|
||||||
|
|
||||||
//if (platform_boot_options() & BOOT_OPTION_DEBUG_OUTPUT)
|
//if (platform_boot_options() & BOOT_OPTION_DEBUG_OUTPUT)
|
||||||
// Bconput(DEV_CONSOLE, buffer);
|
// Bconput(DEV_CONSOLE, buffer);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user