ReactOS  0.4.15-dev-994-ga9f6032
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 
24 #include <debug.h>
26 
27 ULONG NvBase = 0xFD000000;
33 static ULONG Delta;
35 
36 #define CHAR_WIDTH 8
37 #define CHAR_HEIGHT 16
38 
39 #define TOP_BOTTOM_LINES 0
40 
41 #define FB_SIZE_MB 4
42 
43 #define MAKE_COLOR(Red, Green, Blue) (0xff000000 | (((Red) & 0xff) << 16) | (((Green) & 0xff) << 8) | ((Blue) & 0xff))
44 
45 static VOID
46 XboxVideoOutputChar(UCHAR Char, unsigned X, unsigned Y, ULONG FgColor, ULONG BgColor)
47 {
48  PUCHAR FontPtr;
49  PULONG Pixel;
50  UCHAR Mask;
51  unsigned Line;
52  unsigned Col;
53 
54  FontPtr = BitmapFont8x16 + Char * 16;
55  Pixel = (PULONG) ((char *) FrameBuffer + (Y * CHAR_HEIGHT + TOP_BOTTOM_LINES) * Delta
56  + X * CHAR_WIDTH * BytesPerPixel);
57  for (Line = 0; Line < CHAR_HEIGHT; Line++)
58  {
59  Mask = 0x80;
60  for (Col = 0; Col < CHAR_WIDTH; Col++)
61  {
62  Pixel[Col] = (0 != (FontPtr[Line] & Mask) ? FgColor : BgColor);
63  Mask = Mask >> 1;
64  }
65  Pixel = (PULONG) ((char *) Pixel + Delta);
66  }
67 }
68 
69 static ULONG
71 {
73 
74  Intensity = (0 == (Attr & 0x08) ? 127 : 255);
75 
76  return 0xff000000 |
77  (0 == (Attr & 0x04) ? 0 : (Intensity << 16)) |
78  (0 == (Attr & 0x02) ? 0 : (Intensity << 8)) |
79  (0 == (Attr & 0x01) ? 0 : Intensity);
80 }
81 
82 static VOID
83 XboxVideoAttrToColors(UCHAR Attr, ULONG *FgColor, ULONG *BgColor)
84 {
85  *FgColor = XboxVideoAttrToSingleColor(Attr & 0xf);
86  *BgColor = XboxVideoAttrToSingleColor((Attr >> 4) & 0xf);
87 }
88 
89 static VOID
91 {
92  ULONG Line, Col;
93  PULONG p;
94 
95  for (Line = 0; Line < ScreenHeight - (FullScreen ? 0 : 2 * TOP_BOTTOM_LINES); Line++)
96  {
97  p = (PULONG) ((char *) FrameBuffer + (Line + (FullScreen ? 0 : TOP_BOTTOM_LINES)) * Delta);
98  for (Col = 0; Col < ScreenWidth; Col++)
99  {
100  *p++ = Color;
101  }
102  }
103 }
104 
105 VOID
107 {
108  ULONG BgColor, Dummy;
109  ULONG PixelCount = ScreenWidth * CHAR_HEIGHT *
110  (((ScreenHeight - 2 * TOP_BOTTOM_LINES) / CHAR_HEIGHT) - 1);
113 
114  XboxVideoAttrToColors(ATTR(COLOR_WHITE, COLOR_BLACK), &Dummy, &BgColor);
115 
116  while (PixelCount--)
117  *Dst++ = *Src++;
118 
119  for (PixelCount = 0; PixelCount < ScreenWidth * CHAR_HEIGHT; PixelCount++)
120  *Dst++ = BgColor;
121 }
122 
123 VOID
125 {
126  ULONG FgColor, BgColor;
127 
128  XboxVideoAttrToColors(Attr, &FgColor, &BgColor);
129 
131 }
132 
133 VOID
134 XboxVideoPutChar(int Ch, UCHAR Attr, unsigned X, unsigned Y)
135 {
136  ULONG FgColor, BgColor;
137 
138  XboxVideoAttrToColors(Attr, &FgColor, &BgColor);
139 
140  XboxVideoOutputChar(Ch, X, Y, FgColor, BgColor);
141 }
142 
143 UCHAR
145 {
148 }
149 
150 ULONG
152 {
154  INT Count, i;
155 
156  if (!MultibootInfoPtr)
157  {
158  return 0;
159  }
160 
162  {
163  return 0;
164  }
165 
167 
168  if (!MemoryMap ||
170  MultibootInfoPtr->mmap_length % sizeof(memory_map_t) != 0)
171  {
172  return 0;
173  }
174 
176  for (i = 0; i < Count; i++, MemoryMap++)
177  {
178  TRACE("i = %d, base_addr_low = 0x%p, MemoryMap->length_low = 0x%p\n", i, MemoryMap->base_addr_low, MemoryMap->length_low);
179 
180  /* Framebuffer address offset value is coming from the GPU within
181  * memory mapped I/O address space, so we're comparing only low
182  * 28 bits of the address within actual RAM address space */
183  if (MemoryMap->base_addr_low == ((ULONG)Offset & 0x0FFFFFFF) && MemoryMap->base_addr_high == 0)
184  {
185  TRACE("Video memory found\n");
186  return MemoryMap->length_low;
187  }
188  }
189  ERR("Video memory not found!\n");
190  return 0;
191 }
192 
193 VOID
195 {
196  /* Reuse framebuffer that was set up by firmware */
198  /* Verify that framebuffer address is page-aligned */
200 
201  /* Obtain framebuffer memory size from multiboot memory map */
203  {
204  /* Fallback to Cromwell standard which reserves high 4 MB of RAM */
205  FrameBufferSize = 4 * 1024 * 1024;
206  WARN("Could not detect framebuffer memory size, fallback to 4 MB\n");
207  }
208 
211  /* Get BPP directly from NV2A CRTC (magic constants are from Cromwell) */
212  BytesPerPixel = 8 * (((NvGetCrtc(0x19) & 0xE0) << 3) | (NvGetCrtc(0x13) & 0xFF)) / ScreenWidth;
213  if (BytesPerPixel == 4)
214  {
215  ASSERT((NvGetCrtc(0x28) & 0xF) == BytesPerPixel - 1);
216  }
217  else
218  {
219  ASSERT((NvGetCrtc(0x28) & 0xF) == BytesPerPixel);
220  }
221  Delta = (ScreenWidth * BytesPerPixel + 3) & ~ 0x3;
222 
223  /* Verify screen resolution */
224  ASSERT(ScreenWidth > 1);
225  ASSERT(ScreenHeight > 1);
226  ASSERT(BytesPerPixel >= 1 && BytesPerPixel <= 4);
227  /* Verify that screen fits framebuffer size */
229 
231 }
232 
235 {
236  /* We only have one mode, semi-text */
237  return VideoTextMode;
238 }
239 
240 VOID
242 {
243  *Width = ScreenWidth / CHAR_WIDTH;
244  *Height = (ScreenHeight - 2 * TOP_BOTTOM_LINES) / CHAR_HEIGHT;
245  *Depth = 0;
246 }
247 
248 ULONG
250 {
252 }
253 
254 VOID
256 {
257  TRACE("XboxVideoGetFontsFromFirmware(): UNIMPLEMENTED\n");
258 }
259 
260 VOID
262 {
263  /* We don't have a cursor yet */
264 }
265 
266 VOID
268 {
269  /* We don't have a cursor yet */
270 }
271 
272 VOID
274 {
275  PUCHAR OffScreenBuffer = (PUCHAR) Buffer;
276  ULONG Col, Line;
277 
278  for (Line = 0; Line < (ScreenHeight - 2 * TOP_BOTTOM_LINES) / CHAR_HEIGHT; Line++)
279  {
280  for (Col = 0; Col < ScreenWidth / CHAR_WIDTH; Col++)
281  {
282  XboxVideoPutChar(OffScreenBuffer[0], OffScreenBuffer[1], Col, Line);
283  OffScreenBuffer += 2;
284  }
285  }
286 }
287 
288 BOOLEAN
290 {
291  return FALSE;
292 }
293 
294 VOID
296 {
297  /* Not supported */
298 }
299 
300 VOID
302 {
303  /* Not supported */
304 }
305 
306 VOID
308 {
309  /* Not supported */
310 }
311 
312 VOID
314 {
317 }
318 
319 /* 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:814
#define COLOR_BLACK
Definition: ui.h:204
static VOID XboxVideoOutputChar(UCHAR Char, unsigned X, unsigned Y, ULONG FgColor, ULONG BgColor)
Definition: xboxvideo.c:46
#define Y(I)
static VOID XboxVideoClearScreenColor(ULONG Color, BOOLEAN FullScreen)
Definition: xboxvideo.c:90
static ULONG BytesPerPixel
Definition: xboxvideo.c:32
#define TRUE
Definition: types.h:120
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:112
VOID XboxVideoCopyOffScreenBufferToVRAM(PVOID Buffer)
Definition: xboxvideo.c:273
_Inout_ __drv_aliasesMem PSLIST_ENTRY _Inout_ PSLIST_ENTRY _In_ ULONG Count
Definition: exfuncs.h:1173
#define TOP_BOTTOM_LINES
Definition: xboxvideo.c:39
static ULONG ScreenWidth
Definition: xboxvideo.c:30
VOID XboxVideoClearScreen(UCHAR Attr)
Definition: xboxvideo.c:124
Definition: bl.h:199
#define Ch(x, y, z)
Definition: sha2.c:141
NTKERNELAPI ULONG NTAPI READ_REGISTER_ULONG(IN PULONG Register)
int32_t INT
Definition: typedefs.h:58
struct Color Color
uint32_t ULONG_PTR
Definition: typedefs.h:65
ULONG XboxGetFramebufferSize(PVOID Offset)
Definition: xboxvideo.c:151
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:261
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
#define FALSE
Definition: types.h:117
ULONG FrameBufferSize
Definition: xboxvideo.c:29
#define ATTR(cFore, cBack)
Definition: ui.h:192
unsigned char BOOLEAN
ULONG XboxVideoGetBufferSize(VOID)
Definition: xboxvideo.c:249
#define MB_INFO_FLAG_MEMORY_MAP
Definition: multiboot.h:50
Definition: bufpool.h:45
void * PVOID
Definition: retypes.h:9
VOID XboxVideoScrollUp(VOID)
Definition: xboxvideo.c:106
VOID XboxVideoGetFontsFromFirmware(PULONG RomFontPointers)
Definition: xboxvideo.c:255
static VOID XboxVideoAttrToColors(UCHAR Attr, ULONG *FgColor, ULONG *BgColor)
Definition: xboxvideo.c:83
static ULONG ScreenHeight
Definition: xboxvideo.c:31
#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:289
struct memory_map memory_map_t
UCHAR NvGetCrtc(UCHAR Index)
Definition: xboxvideo.c:144
VOID XboxVideoGetDisplaySize(PULONG Width, PULONG Height, PULONG Depth)
Definition: xboxvideo.c:241
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:307
#define CHAR_WIDTH
Definition: xboxvideo.c:36
Definition: bl.h:200
unsigned char UCHAR
Definition: xmlstorage.h:181
VOID XboxVideoInit(VOID)
Definition: xboxvideo.c:194
static WORD Intensity(RGBQUAD clr)
Definition: msrle32.c:44
#define NV2A_RAMDAC_FP_HVALID_END
Definition: xgpu.h:25
enum tagVIDEODISPLAYMODE VIDEODISPLAYMODE
VOID XboxVideoPutChar(int Ch, UCHAR Attr, unsigned X, unsigned Y)
Definition: xboxvideo.c:134
#define PAGE_SIZE
Definition: env_spec_w32.h:49
static ULONG XboxVideoAttrToSingleColor(UCHAR Attr)
Definition: xboxvideo.c:70
#define COLOR_WHITE
Definition: ui.h:220
VOID XboxVideoPrepareForReactOS(VOID)
Definition: xboxvideo.c:313
unsigned long mmap_length
Definition: multiboot.h:108
#define CHAR_HEIGHT
Definition: xboxvideo.c:37
NTKERNELAPI UCHAR NTAPI READ_REGISTER_UCHAR(IN PUCHAR Register)
VOID XboxVideoHideShowTextCursor(BOOLEAN Show)
Definition: xboxvideo.c:267
#define Dst
Definition: mesh.h:153
PVOID FrameBuffer
Definition: xboxvideo.c:28
#define NV2A_CRTC_REGISTER_VALUE
Definition: xgpu.h:23
#define ERR(fmt,...)
Definition: debug.h:110
#define NV2A_RAMDAC_FP_VVALID_END
Definition: xgpu.h:26
#define RomFontPointers
Definition: winldr.c:422
#define NV2A_CRTC_REGISTER_INDEX
Definition: xgpu.h:22
static ULONG Delta
Definition: xboxvideo.c:33
unsigned int * PULONG
Definition: retypes.h:1
#define NV2A_CRTC_FRAMEBUFFER_START
Definition: xgpu.h:21
ULONG NvBase
Definition: xboxvideo.c:27
#define MAKE_COLOR(Red, Green, Blue)
Definition: xboxvideo.c:43
VOID XboxVideoSetPaletteColor(UCHAR Color, UCHAR Red, UCHAR Green, UCHAR Blue)
Definition: xboxvideo.c:295
unsigned int ULONG
Definition: retypes.h:1
VOID XboxVideoGetPaletteColor(UCHAR Color, UCHAR *Red, UCHAR *Green, UCHAR *Blue)
Definition: xboxvideo.c:301
VIDEODISPLAYMODE XboxVideoSetDisplayMode(char *DisplayMode, BOOLEAN Init)
Definition: xboxvideo.c:234
GLfloat GLfloat p
Definition: glext.h:8902
NTKERNELAPI VOID NTAPI WRITE_REGISTER_UCHAR(IN PUCHAR Register, IN UCHAR Value)
struct Line Line