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

  • From: revol@xxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Mon, 25 Oct 2010 00:28:13 +0200 (CEST)

Author: mmu_man
Date: 2010-10-25 00:28:13 +0200 (Mon, 25 Oct 2010)
New Revision: 39135
Changeset: http://dev.haiku-os.org/changeset/39135

Modified:
   haiku/trunk/src/system/boot/platform/amiga_m68k/console.cpp
   haiku/trunk/src/system/boot/platform/amiga_m68k/console.h
   haiku/trunk/src/system/boot/platform/amiga_m68k/rom_calls.h
   haiku/trunk/src/system/boot/platform/amiga_m68k/video.cpp
Log:
Fix setting console position.
Generate a list of video modes, though there seem to be some dups and missing 
ones... The Nominal resolution doesn't mean it can't be better.


Modified: haiku/trunk/src/system/boot/platform/amiga_m68k/console.cpp
===================================================================
--- haiku/trunk/src/system/boot/platform/amiga_m68k/console.cpp 2010-10-24 
22:26:27 UTC (rev 39134)
+++ haiku/trunk/src/system/boot/platform/amiga_m68k/console.cpp 2010-10-24 
22:28:13 UTC (rev 39135)
@@ -23,6 +23,9 @@
                        size_t bufferSize);
                virtual ssize_t WriteAt(void *cookie, off_t pos, const void 
*buffer,
                        size_t bufferSize);
+
+               void    MoveTo(int16 x, int16 y);
+
        private:
                static int16    fX;
                static int16    fY;
@@ -80,7 +83,7 @@
        0xfff
 };
 
-static Screen *sScreen;
+struct Screen *gScreen;
 static int16 sFontWidth, sFontHeight;
 static int sScreenTopOffset = 16;
 int16 ConsoleHandle::fX = 0;
@@ -120,7 +123,7 @@
                if (string[i] == '\0')
                        break;
                if (string[i] == '\n') {
-                       //Text(&sScreen->RastPort, &string[i - len], len);
+                       //Text(&gScreen->RastPort, &string[i - len], len);
                        fX = 0;
                        fY++;
                        if (fY >= console_height())
@@ -129,7 +132,7 @@
                        console_set_cursor(fX, fY);
                        continue;
                }
-               Text(&sScreen->RastPort, &string[i], 1);
+               Text(&gScreen->RastPort, &string[i], 1);
        }
 
        // not exactly, but we don't care...
@@ -137,6 +140,18 @@
 }
 
 
+void
+ConsoleHandle::MoveTo(int16 x, int16 y)
+{
+       fX = x;
+       fY = y;
+       Move(&gScreen->RastPort, sFontWidth * x,
+               sFontHeight * y + sScreenTopOffset);
+       // why do I have to add this to keep the title ?
+       
+}
+
+
 // #pragma mark -
 
 
@@ -169,8 +184,6 @@
 ConsoleDevice::WaitForKey()
 {
        char ascii;
-       ssize_t actual;
-       status_t err;
        
        if (Read(&ascii, 1) < 1) {
                panic("WFK\n");
@@ -347,51 +360,51 @@
                NULL
        };
        
-       sScreen = OpenScreen(&newScreen);
-       if (sScreen == NULL)
+       gScreen = OpenScreen(&newScreen);
+       if (gScreen == NULL)
                panic("OpenScreen()\n");
        
-       LoadRGB4(&sScreen->ViewPort, kPalette, 16);
+       LoadRGB4(&gScreen->ViewPort, kPalette, 16);
        
-       SetDrMd(&sScreen->RastPort, JAM2);
+       SetDrMd(&gScreen->RastPort, JAM2);
        
        // 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);
+       TextFont *font = OpenFont(gScreen->Font);
        if (font == NULL)
                panic("OpenFont()\n");
-       sFontHeight = sScreen->Font->ta_YSize;
+       sFontHeight = gScreen->Font->ta_YSize;
        sFontWidth = font->tf_XSize;
        
-       sScreenTopOffset = sScreen->BarHeight * 2; // ???
+       sScreenTopOffset = gScreen->BarHeight * 2; // ???
 
        
-       //ClearScreen(&sScreen->RastPort);
+       //ClearScreen(&gScreen->RastPort);
 
        dbgerr = stdout = stderr = (FILE *)&sOutput;
 
        console_set_cursor(0, 0);
        
        /*
-       dprintf("LeftEdge %d\n", sScreen->LeftEdge);
-       dprintf("TopEdge %d\n", sScreen->TopEdge);
-       dprintf("Width %d\n", sScreen->Width);
-       dprintf("Height %d\n", sScreen->Height);
-       dprintf("MouseX %d\n", sScreen->MouseX);
-       dprintf("MouseY %d\n", sScreen->MouseY);
-       dprintf("Flags 0x%08x\n", sScreen->Flags);
-       dprintf("BarHeight %d\n", sScreen->BarHeight);
-       dprintf("BarVBorder %d\n", sScreen->BarVBorder);
-       dprintf("BarHBorder %d\n", sScreen->BarHBorder);
-       dprintf("MenuVBorder %d\n", sScreen->MenuVBorder);
-       dprintf("MenuHBorder %d\n", sScreen->MenuHBorder);
-       dprintf("WBorTop %d\n", sScreen->WBorTop);
-       dprintf("WBorLeft %d\n", sScreen->WBorLeft);
-       dprintf("WBorRight %d\n", sScreen->WBorRight);
-       dprintf("WBorBottom %d\n", sScreen->WBorBottom);
+       dprintf("LeftEdge %d\n", gScreen->LeftEdge);
+       dprintf("TopEdge %d\n", gScreen->TopEdge);
+       dprintf("Width %d\n", gScreen->Width);
+       dprintf("Height %d\n", gScreen->Height);
+       dprintf("MouseX %d\n", gScreen->MouseX);
+       dprintf("MouseY %d\n", gScreen->MouseY);
+       dprintf("Flags 0x%08x\n", gScreen->Flags);
+       dprintf("BarHeight %d\n", gScreen->BarHeight);
+       dprintf("BarVBorder %d\n", gScreen->BarVBorder);
+       dprintf("BarHBorder %d\n", gScreen->BarHBorder);
+       dprintf("MenuVBorder %d\n", gScreen->MenuVBorder);
+       dprintf("MenuHBorder %d\n", gScreen->MenuHBorder);
+       dprintf("WBorTop %d\n", gScreen->WBorTop);
+       dprintf("WBorLeft %d\n", gScreen->WBorLeft);
+       dprintf("WBorRight %d\n", gScreen->WBorRight);
+       dprintf("WBorBottom %d\n", gScreen->WBorBottom);
        */
 
        KEYMAP_BASE_NAME = (Library *)OldOpenLibrary(KEYMAPNAME);
@@ -404,8 +417,13 @@
                panic("sInput.Open() 0x%08lx\n", err);
        stdin = (FILE *)&sInput;
 
+       dprintf("BytesPerRow %d\n", gScreen->RastPort.BitMap->BytesPerRow);
+       dprintf("Rows %d\n", gScreen->RastPort.BitMap->Rows);
+       dprintf("Flags %02x\n", gScreen->RastPort.BitMap->Flags);
+       dprintf("Depth %d\n", gScreen->RastPort.BitMap->Depth);
+       for (int i = 0; i < 8; i++)
+               dprintf("Planes[%d] %p\n", i, 
gScreen->RastPort.BitMap->Planes[i]);
        
-
        return B_OK;
 }
 
@@ -416,15 +434,15 @@
 void
 console_clear_screen(void)
 {
-       Move(&sScreen->RastPort, 0, sScreenTopOffset);
-       ClearScreen(&sScreen->RastPort);
+       Move(&gScreen->RastPort, 0, sScreenTopOffset);
+       ClearScreen(&gScreen->RastPort);
 }
 
 
 int32
 console_width(void)
 {
-       int columnCount = sScreen->Width / sFontWidth;
+       int columnCount = gScreen->Width / sFontWidth;
        return columnCount;
 }
 
@@ -432,7 +450,7 @@
 int32
 console_height(void)
 {
-       int lineCount = (sScreen->Height - sScreenTopOffset) / sFontHeight;
+       int lineCount = (gScreen->Height - sScreenTopOffset) / sFontHeight;
        return lineCount;
 }
 
@@ -440,18 +458,15 @@
 void
 console_set_cursor(int32 x, int32 y)
 {
-       Move(&sScreen->RastPort, sFontWidth * x,
-               sFontHeight * y + sScreenTopOffset);
-               // why do I have to add this to keep the title ?
-       
+       sOutput.MoveTo(x, y);
 }
 
 
 void
 console_set_color(int32 foreground, int32 background)
 {
-       SetAPen(&sScreen->RastPort, foreground);
-       SetBPen(&sScreen->RastPort, background);
+       SetAPen(&gScreen->RastPort, foreground);
+       SetBPen(&gScreen->RastPort, background);
 }
 
 

Modified: haiku/trunk/src/system/boot/platform/amiga_m68k/console.h
===================================================================
--- haiku/trunk/src/system/boot/platform/amiga_m68k/console.h   2010-10-24 
22:26:27 UTC (rev 39134)
+++ haiku/trunk/src/system/boot/platform/amiga_m68k/console.h   2010-10-24 
22:28:13 UTC (rev 39135)
@@ -15,6 +15,8 @@
 extern "C" {
 #endif
 
+extern struct Screen *gScreen;
+
 extern status_t console_init(void);
 
 #ifdef __cplusplus

Modified: haiku/trunk/src/system/boot/platform/amiga_m68k/rom_calls.h
===================================================================
--- haiku/trunk/src/system/boot/platform/amiga_m68k/rom_calls.h 2010-10-24 
22:26:27 UTC (rev 39134)
+++ haiku/trunk/src/system/boot/platform/amiga_m68k/rom_calls.h 2010-10-24 
22:28:13 UTC (rev 39135)
@@ -984,7 +984,7 @@
        uint8   dummy1[10];
        uint16  Version, Revision;
        uint8   dummy2[34-24];
-};
+} _PACKED;
 
 // <exec/execbase.h>
 
@@ -995,7 +995,7 @@
        uint8   dummy2[14-10];
        uint16  Attribs;
        uint32  First, Lower, Upper, Free;
-};
+} _PACKED;
 
 struct ExecBase {
        struct Library  LibNode;
@@ -1165,7 +1165,29 @@
 
 //     #pragma mark -
 
+// <graphics/gfx.h>
 
+#ifndef __ASSEMBLER__
+
+struct BitMap {
+       uint16  BytesPerRow;
+       uint16  Rows;
+       uint8   Flags;
+       uint8   Depth;
+       uint16  pad;
+       void    *Planes[8];
+};
+
+struct Rectangle {
+       int16   MinX, MinY, MaxX, MaxY;
+};
+
+struct Point {
+       int16   x, y;
+};
+
+#endif /* __ASSEMBLER__ */
+
 // <graphics/graphics.h>
 
 #define GRAPHICSNAME   "graphics.library"
@@ -1196,7 +1218,7 @@
        struct CopList  *SprIns;
        struct CopList  *ClrIns;
        struct UCopList *UCopIns;
-       int16   DWidth, DHright;
+       int16   DWidth, DHeight;
        int16   DxOffset, DyOffset;
        uint16  Modes;
        uint8   SpritePriorities;
@@ -1206,6 +1228,7 @@
 
 struct RastPort {
        struct Layer    *Layer;
+       struct BitMap   *BitMap;
        //...
 } _PACKED;
 
@@ -1264,14 +1287,88 @@
        LP2NR(0x162, SetDrMd, struct RastPort *, par1, a1, unsigned long, last, 
d0, \
        , GRAPHICS_BASE_NAME)
 
+#define FindDisplayInfo(last) \
+       LP1(0x2d6, DisplayInfoHandle, FindDisplayInfo, unsigned long, last, d0, 
\
+       , GRAPHICS_BASE_NAME)
 
-#endif
+#define NextDisplayInfo(last) \
+       LP1(0x2dc, uint32, NextDisplayInfo, unsigned long, last, d0, \
+       , GRAPHICS_BASE_NAME)
 
+#define GetDisplayInfoData(par1, par2, par3, par4, last) \
+       LP5(0x2f4, uint32, GetDisplayInfoData, DisplayInfoHandle, par1, a0, 
uint8 *, par2, a1, unsigned long, par3, d0, unsigned long, par4, d1, unsigned 
long, last, d2, \
+       , GRAPHICS_BASE_NAME)
+
+
+#endif /* __ASSEMBLER__ */
+
 /* drawing modes */
 #define JAM1   0       // only draw foreground
 #define JAM2   1       // draw both fg & bg
 
+// <graphics/modeid.h>
 
+#define INVALID_ID     (~0)
+
+// <graphics/displayinfo.h>
+
+#ifndef __ASSEMBLER__
+
+typedef void *DisplayInfoHandle;
+
+struct QueryHeader {
+       uint32  StructID;
+       uint32  DisplayID;
+       uint32  SkipID;
+       uint32  Length;
+};
+
+struct DisplayInfo {
+       struct QueryHeader      Header;
+       uint16  NotAvailable;
+       uint32  PropertyFlags;
+       struct Point    Resolution;
+       uint16  PixelSpeed;
+       uint16  NumStdSprites;
+       uint16  PaletteRange;
+       struct Point    SpriteResolution;
+       uint8   pad[4];
+       uint8   RedBits;
+       uint8   GreenBits;
+       uint8   BlueBits;
+       uint8   pad2[5];
+       uint32  reserved[2];
+};
+
+struct DimensionInfo {
+       struct QueryHeader      Header;
+       uint16  MaxDepth;
+       uint16  MinRasterWidth;
+       uint16  MinRasterHeight;
+       uint16  MaxRasterWidth;
+       uint16  MaxRasterHeight;
+       struct Rectangle        Nominal;
+       //... overscan stuff
+       struct Rectangle        overscanStuff[4];
+       uint8   pad[14];
+       uint32  reserved[2];
+};
+
+#define DISPLAYNAMELEN 32
+
+struct NameInfo {
+       struct QueryHeader      Header;
+       uchar   Name[DISPLAYNAMELEN];
+       uint32  reserved[2];
+};
+
+#endif /* __ASSEMBLER__ */
+
+#define DTAG_DISP      0x80000000
+#define DTAG_DIMS      0x80001000
+#define DTAG_MNTR      0x80002000
+#define DTAG_NAME      0x80003000
+
 //     #pragma mark -
 
 
@@ -1361,6 +1458,8 @@
 #define LOWLEVEL_BASE_NAME LowLevelBase
 #endif
 
+#ifndef __ASSEMBLER__
+
 #define GetKey() \
        LP0(0x30, uint32, GetKey, \
        , LOWLEVEL_BASE_NAME)
@@ -1369,6 +1468,7 @@
        LP2NR(0x36, QueryKeys, struct KeyQuery *, par1, a0, unsigned long, 
last, d1, \
        , LOWLEVEL_BASE_NAME)
 
+#endif /* __ASSEMBLER__ */
 
 
 // <devices/keyboard.h>

Modified: haiku/trunk/src/system/boot/platform/amiga_m68k/video.cpp
===================================================================
--- haiku/trunk/src/system/boot/platform/amiga_m68k/video.cpp   2010-10-24 
22:26:27 UTC (rev 39134)
+++ haiku/trunk/src/system/boot/platform/amiga_m68k/video.cpp   2010-10-24 
22:28:13 UTC (rev 39135)
@@ -32,6 +32,8 @@
 
 
 
+
+
 //     #pragma mark -
 
 
@@ -46,7 +48,80 @@
 Menu *
 video_mode_menu()
 {
-       return NULL;
+       Menu *menu = new(nothrow) Menu(CHOICE_MENU, "Select Video Mode");
+       MenuItem *item;
+
+       menu->AddItem(item = new(nothrow) MenuItem("Default"));
+       item->SetMarked(true);
+       item->Select(true);
+       item->SetHelpText("The Default video mode is the one currently 
configured "
+               "in the system. If there is no mode configured yet, a viable 
mode will "
+               "be chosen automatically.");
+
+/*
+       video_mode *mode = NULL;
+       while ((mode = (video_mode *)list_get_next_item(&sModeList, mode)) != 
NULL) {
+               char label[64];
+               sprintf(label, "%ux%u %u bit", mode->width, mode->height,
+                       mode->bits_per_pixel);
+
+               menu->AddItem(item = new(nothrow) MenuItem(label));
+               item->SetData(mode);
+       }
+*/
+#if 1
+       uint32 modeID = INVALID_ID;
+       while ((modeID = NextDisplayInfo(modeID)) != INVALID_ID) {
+               //DisplayInfoHandle handle = FindDisplayInfo(modeID);
+               //if (handle == NULL)
+               //      continue;
+               struct DisplayInfo info;
+               struct DimensionInfo dimension;
+               struct NameInfo name;
+               if (GetDisplayInfoData(NULL, (uint8 *)&info, sizeof(info),
+                       DTAG_DISP, modeID) < 48/*sizeof(struct DisplayInfo)*/)
+                       continue;
+               if (GetDisplayInfoData(NULL, (uint8 *)&dimension, 
sizeof(dimension),
+                       DTAG_DIMS, modeID) < 66)
+                       continue;
+               /*if (GetDisplayInfoData(NULL, (uint8 *)&name, sizeof(name),
+                       DTAG_NAME, modeID) < sizeof(name) - 8)
+                       continue;*/
+               if (info.NotAvailable)
+                       continue;
+               if (dimension.MaxDepth < 4)
+                       continue;
+               //dprintf("name: %s\n", name.Name);
+               /*
+               dprintf("mode 0x%08lx: %dx%d flags: 0x%08lx bpp: %d\n",
+                       modeID, info.Resolution.x, info.Resolution.y, 
info.PropertyFlags,
+                       info.RedBits + info.GreenBits + info.BlueBits);
+               dprintf("mode: %dx%d -> %dx%d\n",
+                       dimension.MinRasterWidth, dimension.MinRasterHeight,
+                       dimension.MaxRasterWidth, dimension.MaxRasterHeight);
+               dprintf("mode: %dx%d %dbpp flags: 0x%08lx\n",
+                       dimension.Nominal.MaxX - dimension.Nominal.MinX + 1,
+                       dimension.Nominal.MaxY - dimension.Nominal.MinY + 1,
+                       dimension.MaxDepth, info.PropertyFlags);
+               */
+               char label[64];
+               sprintf(label, "%ux%u %u bit",
+                       dimension.Nominal.MaxX - dimension.Nominal.MinX + 1,
+                       dimension.Nominal.MaxY - dimension.Nominal.MinY + 1,
+                       dimension.MaxDepth);
+
+               menu->AddItem(item = new(nothrow) MenuItem(label));
+               item->SetData((void *)modeID);
+       }
+       
+#endif
+       dprintf("done\n");
+
+       menu->AddSeparatorItem();
+       menu->AddItem(item = new(nothrow) MenuItem("Return to main menu"));
+       item->SetType(MENU_ITEM_NO_CHOICE);
+
+       return menu;
 }
 
 


Other related posts:

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