ReactOS  0.4.13-dev-698-g77671f0
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 
31 static ULONG Delta;
32 
33 #define CHAR_WIDTH 8
34 #define CHAR_HEIGHT 16
35 
36 #define TOP_BOTTOM_LINES 0
37 
38 #define FB_SIZE_MB 4
39 
40 #define MAKE_COLOR(Red, Green, Blue) (0xff000000 | (((Red) & 0xff) << 16) | (((Green) & 0xff) << 8) | ((Blue) & 0xff))
41 
42 BOOLEAN I2CTransmitByteGetReturn(UCHAR bPicAddressI2cFormat, UCHAR bDataToWrite, ULONG *Return);
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 = XboxFont8x16 + 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 VOID
126 {
127  ULONG AvMode;
128 
130 
131  if (I2CTransmitByteGetReturn(0x10, 0x04, &AvMode))
132  {
133  if (1 == AvMode) /* HDTV */
134  {
135  ScreenWidth = 720;
136  }
137  else
138  {
139  /* FIXME Other possible values of AvMode:
140  * 0 - AV_SCART_RGB
141  * 2 - AV_VGA_SOG
142  * 4 - AV_SVIDEO
143  * 6 - AV_COMPOSITE
144  * 7 - AV_VGA
145  * other AV_COMPOSITE
146  */
147  ScreenWidth = 640;
148  }
149  }
150  else
151  {
152  ScreenWidth = 640;
153  }
154 
155  ScreenHeight = 480;
156  BytesPerPixel = 4;
157  Delta = (ScreenWidth * BytesPerPixel + 3) & ~ 0x3;
158 
160 
161  /* Tell the nVidia controller about the framebuffer */
162  *((PULONG) 0xfd600800) = (ULONG) FrameBuffer;
163 }
164 
167 {
168  /* We only have one mode, semi-text */
169  return VideoTextMode;
170 }
171 
172 VOID
174 {
175  *Width = ScreenWidth / CHAR_WIDTH;
176  *Height = (ScreenHeight - 2 * TOP_BOTTOM_LINES) / CHAR_HEIGHT;
177  *Depth = 0;
178 }
179 
180 ULONG
182 {
184 }
185 
186 VOID
188 {
189  TRACE("XboxVideoGetFontsFromFirmware(): UNIMPLEMENTED\n");
190 }
191 
192 VOID
194 {
195  /* We don't have a cursor yet */
196 }
197 
198 VOID
200 {
201  /* We don't have a cursor yet */
202 }
203 
204 VOID
206 {
207  PUCHAR OffScreenBuffer = (PUCHAR) Buffer;
208  ULONG Col, Line;
209 
210  for (Line = 0; Line < (ScreenHeight - 2 * TOP_BOTTOM_LINES) / CHAR_HEIGHT; Line++)
211  {
212  for (Col = 0; Col < ScreenWidth / CHAR_WIDTH; Col++)
213  {
214  XboxVideoPutChar(OffScreenBuffer[0], OffScreenBuffer[1], Col, Line);
215  OffScreenBuffer += 2;
216  }
217  }
218 }
219 
220 BOOLEAN
222 {
223  return FALSE;
224 }
225 
226 VOID
228 {
229  /* Not supported */
230 }
231 
232 VOID
234 {
235  /* Not supported */
236 }
237 
238 VOID
240 {
241  /* Not supported */
242 }
243 
244 VOID
246 {
247  /* Call PC version */
248  PcBeep();
249 }
250 
251 VOID
253 {
256 }
257 
258 /* 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:30
unsigned char * PUCHAR
Definition: retypes.h:3
VOID XboxVideoCopyOffScreenBufferToVRAM(PVOID Buffer)
Definition: xboxvideo.c:205
#define TOP_BOTTOM_LINES
Definition: xboxvideo.c:36
static ULONG ScreenWidth
Definition: xboxvideo.c:28
VOID XboxVideoClearScreen(UCHAR Attr)
Definition: xboxvideo.c:105
Definition: bl.h:199
#define Ch(x, y, z)
Definition: sha2.c:141
struct Color Color
VOID XboxVideoSetTextCursorPosition(UCHAR X, UCHAR Y)
Definition: xboxvideo.c:193
char Char
Definition: bzip2.c:161
unsigned char BOOLEAN
ULONG XboxVideoGetBufferSize(VOID)
Definition: xboxvideo.c:181
Definition: bufpool.h:45
void * PVOID
Definition: retypes.h:9
BOOLEAN I2CTransmitByteGetReturn(UCHAR bPicAddressI2cFormat, UCHAR bDataToWrite, ULONG *Return)
Definition: xboxi2c.c:175
PVOID XboxMemReserveMemory(ULONG MbToReserve)
Definition: xboxmem.c:118
VOID XboxVideoGetFontsFromFirmware(PULONG RomFontPointers)
Definition: xboxvideo.c:187
static VOID XboxVideoAttrToColors(UCHAR Attr, ULONG *FgColor, ULONG *BgColor)
Definition: xboxvideo.c:82
static ULONG ScreenHeight
Definition: xboxvideo.c:29
#define TRACE(s)
Definition: solgame.cpp:4
VOID XboxBeep(VOID)
Definition: xboxvideo.c:245
BOOLEAN XboxVideoIsPaletteFixed(VOID)
Definition: xboxvideo.c:221
VOID XboxVideoGetDisplaySize(PULONG Width, PULONG Height, PULONG Depth)
Definition: xboxvideo.c:173
UCHAR XboxFont8x16[256 *16]
Definition: xboxfont.c:23
DBG_DEFAULT_CHANNEL(UI)
Definition: ncftp.h:79
static VIDEODISPLAYMODE DisplayMode
Definition: pcvideo.c:116
VOID XboxVideoSync(VOID)
Definition: xboxvideo.c:239
#define CHAR_WIDTH
Definition: xboxvideo.c:33
Definition: bl.h:200
unsigned char UCHAR
Definition: xmlstorage.h:181
VOID XboxVideoInit(VOID)
Definition: xboxvideo.c:125
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
static ULONG XboxVideoAttrToSingleColor(UCHAR Attr)
Definition: xboxvideo.c:69
VOID XboxVideoPrepareForReactOS(VOID)
Definition: xboxvideo.c:252
#define CHAR_HEIGHT
Definition: xboxvideo.c:34
VOID PcBeep(VOID)
Definition: i386rtl.c:25
VOID XboxVideoHideShowTextCursor(BOOLEAN Show)
Definition: xboxvideo.c:199
static PVOID FrameBuffer
Definition: xboxvideo.c:27
#define RomFontPointers
Definition: winldr.c:288
static ULONG Delta
Definition: xboxvideo.c:31
unsigned int * PULONG
Definition: retypes.h:1
#define FB_SIZE_MB
Definition: xboxvideo.c:38
#define MAKE_COLOR(Red, Green, Blue)
Definition: xboxvideo.c:40
VOID XboxVideoSetPaletteColor(UCHAR Color, UCHAR Red, UCHAR Green, UCHAR Blue)
Definition: xboxvideo.c:227
unsigned int ULONG
Definition: retypes.h:1
VOID XboxVideoGetPaletteColor(UCHAR Color, UCHAR *Red, UCHAR *Green, UCHAR *Blue)
Definition: xboxvideo.c:233
VIDEODISPLAYMODE XboxVideoSetDisplayMode(char *DisplayMode, BOOLEAN Init)
Definition: xboxvideo.c:166
GLfloat GLfloat p
Definition: glext.h:8902
struct Line Line