ReactOS  0.4.14-dev-1279-gc1464a4
xboxvideo.c
Go to the documentation of this file.
1 /*
2  * FreeLoader
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17  *
18  * Note: much of this code was based on knowledge and/or code developed
19  * by the Xbox Linux group: http://www.xbox-linux.org
20  */
21 
22 #include <freeldr.h>
23 #include <debug.h>
24 
26 
32 static ULONG Delta;
34 
35 #define CHAR_WIDTH 8
36 #define CHAR_HEIGHT 16
37 
38 #define TOP_BOTTOM_LINES 0
39 
40 #define FB_SIZE_MB 4
41 
42 #define MAKE_COLOR(Red, Green, Blue) (0xff000000 | (((Red) & 0xff) << 16) | (((Green) & 0xff) << 8) | ((Blue) & 0xff))
43 
44 static VOID
45 XboxVideoOutputChar(UCHAR Char, unsigned X, unsigned Y, ULONG FgColor, ULONG BgColor)
46 {
47  PUCHAR FontPtr;
48  PULONG Pixel;
49  UCHAR Mask;
50  unsigned Line;
51  unsigned Col;
52 
53  FontPtr = BitmapFont8x16 + Char * 16;
54  Pixel = (PULONG) ((char *) FrameBuffer + (Y * CHAR_HEIGHT + TOP_BOTTOM_LINES) * Delta
55  + X * CHAR_WIDTH * BytesPerPixel);
56  for (Line = 0; Line < CHAR_HEIGHT; Line++)
57  {
58  Mask = 0x80;
59  for (Col = 0; Col < CHAR_WIDTH; Col++)
60  {
61  Pixel[Col] = (0 != (FontPtr[Line] & Mask) ? FgColor : BgColor);
62  Mask = Mask >> 1;
63  }
64  Pixel = (PULONG) ((char *) Pixel + Delta);
65  }
66 }
67 
68 static ULONG
70 {
72 
73  Intensity = (0 == (Attr & 0x08) ? 127 : 255);
74 
75  return 0xff000000 |
76  (0 == (Attr & 0x04) ? 0 : (Intensity << 16)) |
77  (0 == (Attr & 0x02) ? 0 : (Intensity << 8)) |
78  (0 == (Attr & 0x01) ? 0 : Intensity);
79 }
80 
81 static VOID
82 XboxVideoAttrToColors(UCHAR Attr, ULONG *FgColor, ULONG *BgColor)
83 {
84  *FgColor = XboxVideoAttrToSingleColor(Attr & 0xf);
85  *BgColor = XboxVideoAttrToSingleColor((Attr >> 4) & 0xf);
86 }
87 
88 static VOID
90 {
91  ULONG Line, Col;
92  PULONG p;
93 
94  for (Line = 0; Line < ScreenHeight - (FullScreen ? 0 : 2 * TOP_BOTTOM_LINES); Line++)
95  {
96  p = (PULONG) ((char *) FrameBuffer + (Line + (FullScreen ? 0 : TOP_BOTTOM_LINES)) * Delta);
97  for (Col = 0; Col < ScreenWidth; Col++)
98  {
99  *p++ = Color;
100  }
101  }
102 }
103 
104 VOID
106 {
107  ULONG FgColor, BgColor;
108 
109  XboxVideoAttrToColors(Attr, &FgColor, &BgColor);
110 
112 }
113 
114 VOID
115 XboxVideoPutChar(int Ch, UCHAR Attr, unsigned X, unsigned Y)
116 {
117  ULONG FgColor, BgColor;
118 
119  XboxVideoAttrToColors(Attr, &FgColor, &BgColor);
120 
121  XboxVideoOutputChar(Ch, X, Y, FgColor, BgColor);
122 }
123 
124 UCHAR
126 {
128  return *((PUCHAR) NV2A_CRTC_REGISTER_VALUE);
129 }
130 
131 ULONG
133 {
135  INT Count, i;
136 
137  if (!MultibootInfoPtr)
138  {
139  return 0;
140  }
141 
143  {
144  return 0;
145  }
146 
148 
149  if (!MemoryMap ||
151  MultibootInfoPtr->mmap_length % sizeof(memory_map_t) != 0)
152  {
153  return 0;
154  }
155 
157  for (i = 0; i < Count; i++, MemoryMap++)
158  {
159  TRACE("i = %d, base_addr_low = 0x%p, MemoryMap->length_low = 0x%p\n", i, MemoryMap->base_addr_low, MemoryMap->length_low);
160 
161  /* Framebuffer address offset value is coming from the GPU within
162  * memory mapped I/O address space, so we're comparing only low
163  * 28 bits of the address within actual RAM address space */
164  if (MemoryMap->base_addr_low == ((ULONG)Offset & 0x0FFFFFFF) && MemoryMap->base_addr_high == 0)
165  {
166  TRACE("Video memory found\n");
167  return MemoryMap->length_low;
168  }
169  }
170  ERR("Video memory not found!\n");
171  return 0;
172 }
173 
174 VOID
176 {
177  /* Reuse framebuffer that was set up by firmware */
179  /* Verify that framebuffer address is page-aligned */
181 
182  /* Obtain framebuffer memory size from multiboot memory map */
184  {
185  /* Fallback to Cromwell standard which reserves high 4 MB of RAM */
186  FrameBufferSize = 4 * 1024 * 1024;
187  WARN("Could not detect framebuffer memory size, fallback to 4 MB\n");
188  }
189 
192  /* Get BPP directly from NV2A CRTC (magic constants are from Cromwell) */
193  BytesPerPixel = 8 * (((NvGetCrtc(0x19) & 0xE0) << 3) | (NvGetCrtc(0x13) & 0xFF)) / ScreenWidth;
194  if (BytesPerPixel == 4)
195  {
196  ASSERT((NvGetCrtc(0x28) & 0xF) == BytesPerPixel - 1);
197  }
198  else
199  {
200  ASSERT((NvGetCrtc(0x28) & 0xF) == BytesPerPixel);
201  }
202  Delta = (ScreenWidth * BytesPerPixel + 3) & ~ 0x3;
203 
204  /* Verify screen resolution */
205  ASSERT(ScreenWidth > 1);
206  ASSERT(ScreenHeight > 1);
207  ASSERT(BytesPerPixel >= 1 && BytesPerPixel <= 4);
208  /* Verify that screen fits framebuffer size */
210 
212 }
213 
216 {
217  /* We only have one mode, semi-text */
218  return VideoTextMode;
219 }
220 
221 VOID
223 {
224  *Width = ScreenWidth / CHAR_WIDTH;
225  *Height = (ScreenHeight - 2 * TOP_BOTTOM_LINES) / CHAR_HEIGHT;
226  *Depth = 0;
227 }
228 
229 ULONG
231 {
233 }
234 
235 VOID
237 {
238  TRACE("XboxVideoGetFontsFromFirmware(): UNIMPLEMENTED\n");
239 }
240 
241 VOID
243 {
244  /* We don't have a cursor yet */
245 }
246 
247 VOID
249 {
250  /* We don't have a cursor yet */
251 }
252 
253 VOID
255 {
256  PUCHAR OffScreenBuffer = (PUCHAR) Buffer;
257  ULONG Col, Line;
258 
259  for (Line = 0; Line < (ScreenHeight - 2 * TOP_BOTTOM_LINES) / CHAR_HEIGHT; Line++)
260  {
261  for (Col = 0; Col < ScreenWidth / CHAR_WIDTH; Col++)
262  {
263  XboxVideoPutChar(OffScreenBuffer[0], OffScreenBuffer[1], Col, Line);
264  OffScreenBuffer += 2;
265  }
266  }
267 }
268 
269 BOOLEAN
271 {
272  return FALSE;
273 }
274 
275 VOID
277 {
278  /* Not supported */
279 }
280 
281 VOID
283 {
284  /* Not supported */
285 }
286 
287 VOID
289 {
290  /* Not supported */
291 }
292 
293 VOID
295 {
298 }
299 
300 /* EOF */
Definition: bl.h:202
_In_opt_ PALLOCATE_FUNCTION _In_opt_ PFREE_FUNCTION _In_ ULONG _In_ SIZE_T _In_ ULONG _In_ USHORT Depth
Definition: exfuncs.h:656
#define TRUE
Definition: types.h:120
static VOID XboxVideoOutputChar(UCHAR Char, unsigned X, unsigned Y, ULONG FgColor, ULONG BgColor)
Definition: xboxvideo.c:45
#define Y(I)
static VOID XboxVideoClearScreenColor(ULONG Color, BOOLEAN FullScreen)
Definition: xboxvideo.c:89
static ULONG BytesPerPixel
Definition: xboxvideo.c:31
unsigned long mmap_addr
Definition: multiboot.h:109
BIOS_MEMORY_MAP MemoryMap[32]
Definition: loader.c:11
unsigned char * PUCHAR
Definition: retypes.h:3
UCHAR BitmapFont8x16[]
Definition: vgafont.c:12
#define WARN(fmt,...)
Definition: debug.h:111
VOID XboxVideoCopyOffScreenBufferToVRAM(PVOID Buffer)
Definition: xboxvideo.c:254
_Inout_ __drv_aliasesMem PSLIST_ENTRY _Inout_ PSLIST_ENTRY _In_ ULONG Count
Definition: exfuncs.h:1015
#define TOP_BOTTOM_LINES
Definition: xboxvideo.c:38
static ULONG ScreenWidth
Definition: xboxvideo.c:29
VOID XboxVideoClearScreen(UCHAR Attr)
Definition: xboxvideo.c:105
Definition: bl.h:199
#define Ch(x, y, z)
Definition: sha2.c:141
int32_t INT
Definition: typedefs.h:57
struct Color Color
uint32_t ULONG_PTR
Definition: typedefs.h:64
ULONG XboxGetFramebufferSize(PVOID Offset)
Definition: xboxvideo.c:132
unsigned long flags
Definition: multiboot.h:96
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
VOID XboxVideoSetTextCursorPosition(UCHAR X, UCHAR Y)
Definition: xboxvideo.c:242
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
#define NV2A_CRTC_REGISTER_VALUE
Definition: machxbox.h:44
#define NV2A_RAMDAC_FP_VVALID_END
Definition: machxbox.h:47
ULONG FrameBufferSize
Definition: xboxvideo.c:28
unsigned char BOOLEAN
#define NV2A_CRTC_REGISTER_INDEX
Definition: machxbox.h:43
ULONG XboxVideoGetBufferSize(VOID)
Definition: xboxvideo.c:230
#define MB_INFO_FLAG_MEMORY_MAP
Definition: multiboot.h:50
Definition: bufpool.h:45
void * PVOID
Definition: retypes.h:9
#define NV2A_CRTC_FRAMEBUFFER_START
Definition: machxbox.h:42
VOID XboxVideoGetFontsFromFirmware(PULONG RomFontPointers)
Definition: xboxvideo.c:236
static VOID XboxVideoAttrToColors(UCHAR Attr, ULONG *FgColor, ULONG *BgColor)
Definition: xboxvideo.c:82
static ULONG ScreenHeight
Definition: xboxvideo.c:30
#define TRACE(s)
Definition: solgame.cpp:4
if(!(yy_init))
Definition: macro.lex.yy.c:714
multiboot_info_t * MultibootInfoPtr
BOOLEAN XboxVideoIsPaletteFixed(VOID)
Definition: xboxvideo.c:270
struct memory_map memory_map_t
UCHAR NvGetCrtc(UCHAR Index)
Definition: xboxvideo.c:125
VOID XboxVideoGetDisplaySize(PULONG Width, PULONG Height, PULONG Depth)
Definition: xboxvideo.c:222
static const UCHAR Index[8]
Definition: usbohci.c:18
DBG_DEFAULT_CHANNEL(UI)
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
Definition: ncftp.h:79
static VIDEODISPLAYMODE DisplayMode
Definition: pcvideo.c:115
VOID XboxVideoSync(VOID)
Definition: xboxvideo.c:288
#define CHAR_WIDTH
Definition: xboxvideo.c:35
Definition: bl.h:200
unsigned char UCHAR
Definition: xmlstorage.h:181
VOID XboxVideoInit(VOID)
Definition: xboxvideo.c:175
static WORD Intensity(RGBQUAD clr)
Definition: msrle32.c:44
enum tagVIDEODISPLAYMODE VIDEODISPLAYMODE
VOID XboxVideoPutChar(int Ch, UCHAR Attr, unsigned X, unsigned Y)
Definition: xboxvideo.c:115
#define PAGE_SIZE
Definition: env_spec_w32.h:49
static ULONG XboxVideoAttrToSingleColor(UCHAR Attr)
Definition: xboxvideo.c:69
VOID XboxVideoPrepareForReactOS(VOID)
Definition: xboxvideo.c:294
unsigned long mmap_length
Definition: multiboot.h:108
#define CHAR_HEIGHT
Definition: xboxvideo.c:36
VOID XboxVideoHideShowTextCursor(BOOLEAN Show)
Definition: xboxvideo.c:248
PVOID FrameBuffer
Definition: xboxvideo.c:27
#define ERR(fmt,...)
Definition: debug.h:109
#define RomFontPointers
Definition: winldr.c:422
static ULONG Delta
Definition: xboxvideo.c:32
unsigned int * PULONG
Definition: retypes.h:1
#define MAKE_COLOR(Red, Green, Blue)
Definition: xboxvideo.c:42
VOID XboxVideoSetPaletteColor(UCHAR Color, UCHAR Red, UCHAR Green, UCHAR Blue)
Definition: xboxvideo.c:276
unsigned int ULONG
Definition: retypes.h:1
VOID XboxVideoGetPaletteColor(UCHAR Color, UCHAR *Red, UCHAR *Green, UCHAR *Blue)
Definition: xboxvideo.c:282
VIDEODISPLAYMODE XboxVideoSetDisplayMode(char *DisplayMode, BOOLEAN Init)
Definition: xboxvideo.c:215
GLfloat GLfloat p
Definition: glext.h:8902
#define NV2A_RAMDAC_FP_HVALID_END
Definition: machxbox.h:46
struct Line Line