[haiku-commits] r39264 - haiku/trunk/src/system/boot/platform/amiga_m68k

  • From: revol@xxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Mon, 1 Nov 2010 23:35:44 +0100 (CET)

Author: mmu_man
Date: 2010-11-01 23:35:43 +0100 (Mon, 01 Nov 2010)
New Revision: 39264
Changeset: http://dev.haiku-os.org/changeset/39264

Modified:
   haiku/trunk/src/system/boot/platform/amiga_m68k/console.cpp
   haiku/trunk/src/system/boot/platform/amiga_m68k/devices.cpp
   haiku/trunk/src/system/boot/platform/amiga_m68k/rom_calls.h
   haiku/trunk/src/system/boot/platform/amiga_m68k/video.cpp
Log:
Rework the ConsoleDevice to be a full featured window based console.
Only looses high intensity color from the plain console, but doesn't eat 
keystrokes, and a 2nd window opens for dprintf stuff.
Only Amiga makes it possible ;-)
http://revolf.free.fr/beos/shots/shot_haiku_loader_amiga_m68k_004.png


Modified: haiku/trunk/src/system/boot/platform/amiga_m68k/console.cpp
===================================================================
--- haiku/trunk/src/system/boot/platform/amiga_m68k/console.cpp 2010-11-01 
21:39:47 UTC (rev 39263)
+++ haiku/trunk/src/system/boot/platform/amiga_m68k/console.cpp 2010-11-01 
22:35:43 UTC (rev 39264)
@@ -24,7 +24,11 @@
                virtual ssize_t WriteAt(void *cookie, off_t pos, const void 
*buffer,
                        size_t bufferSize);
 
+               void    Clear();
                void    MoveTo(int16 x, int16 y);
+               void    SetColor(int32 foreground, int32 background);
+               int             Columns();
+               int             Rows();
 
        private:
                static int16    fX;
@@ -34,7 +38,7 @@
 
 class ConsoleDevice : public ExecDevice {
        public:
-               ConsoleDevice();
+               ConsoleDevice(const char *title);
                virtual ~ConsoleDevice();
 
                status_t        Open();
@@ -42,9 +46,19 @@
                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);
 
+               void    Clear();
+               void    MoveTo(int16 x, int16 y);
+               void    SetColor(int32 foreground, int32 background);
+
+               int             Columns();
+               int             Rows();
+
                int     WaitForKey();
 
        protected:
+               const char      *fTitle;
+               struct Window   *fWindow;
+               int     fRows, fCols;
 };
 
 class KeyboardDevice : public ExecDevice {
@@ -156,6 +170,14 @@
 
 
 void
+ConsoleHandle::Clear()
+{
+       Move(&gScreen->RastPort, 0, sScreenTopOffset);
+       ClearScreen(&gScreen->RastPort);
+}
+
+
+void
 ConsoleHandle::MoveTo(int16 x, int16 y)
 {
        fX = x;
@@ -167,11 +189,37 @@
 }
 
 
+void
+ConsoleHandle::SetColor(int32 foreground, int32 background)
+{
+       SetAPen(&gScreen->RastPort, foreground);
+       SetBPen(&gScreen->RastPort, background);
+}
+
+
+int
+ConsoleHandle::Columns()
+{
+       int columnCount = gScreen->Width / sFontWidth;
+       return columnCount;
+}
+
+
+int
+ConsoleHandle::Rows()
+{
+       int lineCount = (gScreen->Height - sScreenTopOffset) / sFontHeight;
+       return lineCount;
+}
+
+
 // #pragma mark -
 
 
-ConsoleDevice::ConsoleDevice()
-       : ExecDevice()
+ConsoleDevice::ConsoleDevice(const char *title)
+       : ExecDevice(),
+       fTitle(title),
+       fWindow(NULL)
 {
 }
 
@@ -184,7 +232,57 @@
 status_t
 ConsoleDevice::Open()
 {
-       return ExecDevice::Open("console.device", -1);
+       status_t err;
+       
+       if (fWindow)
+               return B_ERROR;
+
+       err = AllocRequest(sizeof(struct IOStdReq));
+       if (err < B_OK)
+               panic("AllocRequest");;
+       if (err < B_OK)
+               return err;
+
+       int16 topEdge = gScreen->Height - 60;
+       int height = 60;
+
+       if (fTitle == NULL) {
+               topEdge = 10;
+               height = gScreen->Height - 40;
+               fTitle = "Console";
+       }
+
+       struct NewWindow newWindow = {
+               0, topEdge,
+               gScreen->Width, height,
+               BLACK, WHITE,
+               IDCMP_CLOSEWINDOW,
+               WFLG_SIZEGADGET | WFLG_DRAGBAR | WFLG_DEPTHGADGET | 
WFLG_SIMPLE_REFRESH
+                       | WFLG_ACTIVATE,
+               NULL,
+               NULL,
+               fTitle,
+               gScreen,
+               NULL,
+               100, 45,
+               gScreen->Width, gScreen->Height,
+               CUSTOMSCREEN
+       };
+       
+       fWindow = OpenWindow(&newWindow);
+       if (fWindow == NULL)
+               panic("OpenWindow");;
+       if (fWindow == NULL)
+               return B_ERROR;
+       fIOStdReq->io_Data = fWindow;
+       fIOStdReq->io_Length = sizeof(struct Window);
+       err = ExecDevice::Open(CONSOLENAME, CONU_STANDARD, 0);
+       if (err < B_OK)
+               return err;
+
+       MoveTo(0, 0);
+       SetColor(WHITE, BLACK);
+       Clear();
 }
 
 
@@ -200,27 +298,44 @@
 {
        char ascii;
        
-       if (Read(&ascii, 1) < 1) {
-               panic("WFK\n");
-               return 0;
-       }
-       dprintf("ascii %d %c\n", ascii, ascii);
+       if (Read(&ascii, 1) < 1)
+               return TEXT_CONSOLE_NO_KEY;
+       //dprintf("ascii %d %c\n", ascii, ascii);
 
-       switch (ascii) {
-               case IECODE_KEY_UP:
-                       return TEXT_CONSOLE_KEY_UP;
-               case IECODE_KEY_DOWN:
-                       return TEXT_CONSOLE_KEY_DOWN;
-               case IECODE_KEY_LEFT:
-                       return TEXT_CONSOLE_KEY_LEFT;
-               case IECODE_KEY_RIGHT:
-                       return TEXT_CONSOLE_KEY_RIGHT;
-               case IECODE_KEY_PAGE_UP:
-                       return TEXT_CONSOLE_KEY_PAGE_UP;
-               case IECODE_KEY_PAGE_DOWN:
-                       return TEXT_CONSOLE_KEY_PAGE_DOWN;
-               default:
-                       break;
+       if (ascii == (char)0x9b) {
+               if (Read(&ascii, 1) < 1)
+                       return TEXT_CONSOLE_NO_KEY;
+               //dprintf(">ascii %d %c\n", ascii, ascii);
+               switch (ascii) {
+                       case 'A':
+                               return TEXT_CONSOLE_KEY_UP;
+                       case 'B':
+                               return TEXT_CONSOLE_KEY_DOWN;
+                       case 'D':
+                               return TEXT_CONSOLE_KEY_LEFT;
+                       case 'C':
+                               return TEXT_CONSOLE_KEY_RIGHT;
+                       case '4':
+                       {
+                               if (Read(&ascii, 1) < 1)
+                                       return TEXT_CONSOLE_NO_KEY;
+                               if (ascii == '~')
+                                       return TEXT_CONSOLE_NO_KEY;
+                               switch (ascii) {
+                                       case '1':
+                                               Read(&ascii, 1); // ~
+                                               return TEXT_CONSOLE_KEY_PAGE_UP;
+                                       case '2':
+                                               Read(&ascii, 1); // ~
+                                               return TEXT_CONSOLE_KEY_PAGE_UP;
+                                       default:
+                                               return TEXT_CONSOLE_NO_KEY;
+                               }
+                               return TEXT_CONSOLE_NO_KEY;
+                       }
+                       default:
+                               break;
+               }
        }
        return ascii;
 }
@@ -233,6 +348,74 @@
 }
 
 
+void
+ConsoleDevice::Clear()
+{
+       char buff[] = "\x0c";
+       WriteAt(NULL, 0LL, buff, sizeof(buff) - 1);
+}
+
+
+void
+ConsoleDevice::MoveTo(int16 x, int16 y)
+{
+       char buff[32];
+       x = MIN(79,MAX(0,x));
+       y = MIN(24,MAX(0,y));
+       sprintf(buff, "\x9b%02d;%02d\x48", y + 1, x + 1);
+       //buff[4] += (char)x;
+       //buff[2] += (char)y;
+       WriteAt(NULL, 0LL, buff, strlen(buff));
+}
+
+
+void
+ConsoleDevice::SetColor(int32 foreground, int32 background)
+{
+       //char buff[] = "\x9b37;40m";
+       char buff[] = "\2330;30;40m";
+
+       
+       if (foreground >= 8) {
+               foreground -= 8;
+               //buff[1] = '1'; // bold
+       }
+       
+       // else
+       //      buff[1] = '2';
+       //if (background >= 8)
+       //      background -= 8;
+
+       if (foreground == background) {
+               foreground = 7 - background;
+       }
+
+       if (foreground < 8)
+               buff[4] += foreground;
+
+       if (background < 8)
+               buff[7] += background;
+
+       WriteAt(NULL, 0LL, buff, sizeof(buff) - 1);
+}
+
+
+int
+ConsoleDevice::Columns()
+{
+       struct ConUnit *unit = (struct ConUnit *)fIOStdReq->io_Unit;
+       return unit->cu_XMax;
+}
+
+
+int
+ConsoleDevice::Rows()
+{
+       struct ConUnit *unit = (struct ConUnit *)fIOStdReq->io_Unit;
+       return unit->cu_YMax - 1;
+}
+
+
 // #pragma mark -
 
 
@@ -445,11 +628,14 @@
 //     #pragma mark -
 
 
-static ConsoleHandle sOutput;
-static ConsoleHandle sErrorOutput;
-static ConsoleHandle sDebugOutput;
+static ConsoleDevice sOutput(NULL);
+//static ConsoleHandle sOutput;
+//static ConsoleHandle sErrorOutput;
+//static ConsoleHandle sDebugOutput;
+static ConsoleDevice sDebugOutput("Debug");
 
-static KeyboardDevice sInput;
+//static KeyboardDevice sInput;
+static ConsoleDevice &sInput = sOutput;
 
 
 status_t
@@ -498,8 +684,19 @@
        
        //ClearScreen(&gScreen->RastPort);
 
-       dbgerr = stdout = stderr = (FILE *)&sOutput;
+       
+       err = sDebugOutput.Open();
+       if (err < B_OK)
+               panic("sDebugOutput.Open() 0x%08lx\n", err);
+       dbgerr = stderr = (FILE *)&sDebugOutput;
 
+
+       err = sOutput.Open();
+       if (err < B_OK)
+               panic("sOutput.Open() 0x%08lx\n", err);
+
+       stdout = (FILE *)&sOutput;
+
        console_set_cursor(0, 0);
        
        /*
@@ -526,10 +723,11 @@
                panic("Cannot open %s", KEYMAPNAME);
 
        
-       sInput.AllocRequest(sizeof(struct IOStdReq));
+       /*
        err = sInput.Open();
        if (err < B_OK)
                panic("sInput.Open() 0x%08lx\n", err);
+       */
        stdin = (FILE *)&sInput;
        
        return B_OK;
@@ -542,24 +740,21 @@
 void
 console_clear_screen(void)
 {
-       Move(&gScreen->RastPort, 0, sScreenTopOffset);
-       ClearScreen(&gScreen->RastPort);
+       sOutput.Clear();
 }
 
 
 int32
 console_width(void)
 {
-       int columnCount = gScreen->Width / sFontWidth;
-       return columnCount;
+       return sOutput.Columns();
 }
 
 
 int32
 console_height(void)
 {
-       int lineCount = (gScreen->Height - sScreenTopOffset) / sFontHeight;
-       return lineCount;
+       return sOutput.Rows();
 }
 
 
@@ -573,8 +768,7 @@
 void
 console_set_color(int32 foreground, int32 background)
 {
-       SetAPen(&gScreen->RastPort, foreground);
-       SetBPen(&gScreen->RastPort, background);
+       sOutput.SetColor(foreground, background);
 }
 
 

Modified: haiku/trunk/src/system/boot/platform/amiga_m68k/devices.cpp
===================================================================
--- haiku/trunk/src/system/boot/platform/amiga_m68k/devices.cpp 2010-11-01 
21:39:47 UTC (rev 39263)
+++ haiku/trunk/src/system/boot/platform/amiga_m68k/devices.cpp 2010-11-01 
22:35:43 UTC (rev 39264)
@@ -51,6 +51,8 @@
 
 ExecDevice::ExecDevice()
 {
+       fIORequest = NULL;
+       fIOStdReq = NULL;
 }
 
 
@@ -72,7 +74,7 @@
        if (fIORequest == NULL)
                panic("CreateIORequest()");
        fIOStdReq = (struct IOStdReq *)fIORequest;
-       return B_ERROR;
+       return B_OK;
 }
 
 

Modified: haiku/trunk/src/system/boot/platform/amiga_m68k/rom_calls.h
===================================================================
--- haiku/trunk/src/system/boot/platform/amiga_m68k/rom_calls.h 2010-11-01 
21:39:47 UTC (rev 39263)
+++ haiku/trunk/src/system/boot/platform/amiga_m68k/rom_calls.h 2010-11-01 
22:35:43 UTC (rev 39264)
@@ -969,6 +969,14 @@
        const char *ln_Name;
 };
 
+struct List {
+       struct ListNode *lh_Head;
+       struct ListNode *lh_Tail;
+       struct ListNode *lh_TailPred;
+       uint8   lh_Type;
+       uint8   lh_pad;
+};
+
 // <exec/lists.h>
 
 
@@ -1016,6 +1024,14 @@
        uint16  mn_Length;
 } _PACKED;
 
+struct MsgPort {
+       struct ListNode mp_Node;
+       uint8   mp_Flags;
+       uint8   mp_SigBits;
+       void    *mp_SigTask;
+       struct List     mp_MsgList;
+} _PACKED;
+
 #endif /* __ASSEMBLER__ */
 
 
@@ -1402,6 +1418,44 @@
 
 #ifndef __ASSEMBLER__
 
+struct Window {
+       uint8 dummy1[136];
+};
+
+struct NewWindow {
+       int16   LeftEdge, TopEdge;
+       int16   Width, Height;
+       uint8   DetailPen, BlockPen;
+       uint32  IDCMPFlags;
+       uint32  Flags;
+       struct Gadget   *FirstGadget;
+       struct Image    *CheckMark;
+       const char      *Title;
+       struct Screen   *Screen;
+       struct BitMap   *BitMap;
+       int16   MinWidth, MinHeight;
+       uint16  MaxWidth, MaxHeight;
+       uint16  Type;
+};
+
+#endif /* __ASSEMBLER__ */
+
+#define CUSTOMSCREEN 0x000f
+
+#define IDCMP_CLOSEWINDOW      0x00000200
+
+#define WFLG_SIZEGADGET                0x00000001
+#define WFLG_DRAGBAR           0x00000002
+#define WFLG_DEPTHGADGET       0x00000004
+#define WFLG_CLOSEGADGET       0x00000008
+
+#define WFLG_SMART_REFRESH     0x00000000
+#define WFLG_SIMPLE_REFRESH    0x00000040
+
+#define WFLG_ACTIVATE          0x00001000
+
+#ifndef __ASSEMBLER__
+
 // <intuition/screen.h>
 
 struct NewScreen {
@@ -1448,10 +1502,39 @@
        LP1(0xc6, struct Screen *, OpenScreen, struct NewScreen *, last, a0, \
        , INTUITION_BASE_NAME)
 
+#define OpenWindow(last) \
+       LP1(0xcc, struct Window *, OpenWindow, struct NewWindow *, last, a0, \
+       , INTUITION_BASE_NAME)
 
+#define RemakeDisplay() \
+       LP0(0x180, int32, RemakeDisplay, \
+       , INTUITION_BASE_NAME)
+
+
 #endif /* __ASSEMBLER__ */
 
 
+// <devices/conunit.h>
+
+#define CONU_LIBRARY -1
+#define CONU_STANDARD 0
+#define CONU_CHARMAP 1
+
+#ifndef __ASSEMBLER__
+
+struct ConUnit {
+       struct MsgPort  cu_MP;
+       struct Window   *cu_Window;
+       int16   cu_XCP, cu_YCP;
+       int16   cu_XMax, cu_YMax;
+};
+
+#endif /* __ASSEMBLER__ */
+
+// <devices/console.h>
+
+#define CONSOLENAME "console.device"
+
 // <devices/keymap.h>
 
 #ifndef KEYMAP_BASE_NAME

Modified: haiku/trunk/src/system/boot/platform/amiga_m68k/video.cpp
===================================================================
--- haiku/trunk/src/system/boot/platform/amiga_m68k/video.cpp   2010-11-01 
21:39:47 UTC (rev 39263)
+++ haiku/trunk/src/system/boot/platform/amiga_m68k/video.cpp   2010-11-01 
22:35:43 UTC (rev 39264)
@@ -234,7 +234,7 @@
        
        sFrameBuffer = gKernelArgs.frame_buffer.physical_buffer.start;
 
-       video_display_splash(sFrameBuffer);
+       //video_display_splash(sFrameBuffer);
 
 }
 
@@ -243,6 +243,8 @@
 platform_switch_to_text_mode(void)
 {
        // TODO: implement me
+       // force Intuition to redraw everything
+       RemakeDisplay();
 }
 
 


Other related posts:

  • » [haiku-commits] r39264 - haiku/trunk/src/system/boot/platform/amiga_m68k - revol