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.
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.
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.
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
25 DBG_DEFAULT_CHANNEL(UI
);
28 ULONG FrameBufferSize
;
29 static ULONG ScreenWidth
;
30 static ULONG ScreenHeight
;
31 static ULONG BytesPerPixel
;
35 #define CHAR_HEIGHT 16
37 #define TOP_BOTTOM_LINES 0
41 #define MAKE_COLOR(Red, Green, Blue) (0xff000000 | (((Red) & 0xff) << 16) | (((Green) & 0xff) << 8) | ((Blue) & 0xff))
44 XboxVideoOutputChar(UCHAR Char
, unsigned X
, unsigned Y
, ULONG FgColor
, ULONG BgColor
)
52 FontPtr
= XboxFont8x16
+ Char
* 16;
53 Pixel
= (PULONG
) ((char *) FrameBuffer
+ (Y
* CHAR_HEIGHT
+ TOP_BOTTOM_LINES
) * Delta
54 + X
* CHAR_WIDTH
* BytesPerPixel
);
55 for (Line
= 0; Line
< CHAR_HEIGHT
; Line
++)
58 for (Col
= 0; Col
< CHAR_WIDTH
; Col
++)
60 Pixel
[Col
] = (0 != (FontPtr
[Line
] & Mask
) ? FgColor
: BgColor
);
63 Pixel
= (PULONG
) ((char *) Pixel
+ Delta
);
68 XboxVideoAttrToSingleColor(UCHAR Attr
)
72 Intensity
= (0 == (Attr
& 0x08) ? 127 : 255);
75 (0 == (Attr
& 0x04) ? 0 : (Intensity
<< 16)) |
76 (0 == (Attr
& 0x02) ? 0 : (Intensity
<< 8)) |
77 (0 == (Attr
& 0x01) ? 0 : Intensity
);
81 XboxVideoAttrToColors(UCHAR Attr
, ULONG
*FgColor
, ULONG
*BgColor
)
83 *FgColor
= XboxVideoAttrToSingleColor(Attr
& 0xf);
84 *BgColor
= XboxVideoAttrToSingleColor((Attr
>> 4) & 0xf);
88 XboxVideoClearScreenColor(ULONG Color
, BOOLEAN FullScreen
)
93 for (Line
= 0; Line
< ScreenHeight
- (FullScreen
? 0 : 2 * TOP_BOTTOM_LINES
); Line
++)
95 p
= (PULONG
) ((char *) FrameBuffer
+ (Line
+ (FullScreen
? 0 : TOP_BOTTOM_LINES
)) * Delta
);
96 for (Col
= 0; Col
< ScreenWidth
; Col
++)
104 XboxVideoClearScreen(UCHAR Attr
)
106 ULONG FgColor
, BgColor
;
108 XboxVideoAttrToColors(Attr
, &FgColor
, &BgColor
);
110 XboxVideoClearScreenColor(BgColor
, FALSE
);
114 XboxVideoPutChar(int Ch
, UCHAR Attr
, unsigned X
, unsigned Y
)
116 ULONG FgColor
, BgColor
;
118 XboxVideoAttrToColors(Attr
, &FgColor
, &BgColor
);
120 XboxVideoOutputChar(Ch
, X
, Y
, FgColor
, BgColor
);
124 NvGetCrtc(UCHAR Index
)
126 *((PUCHAR
) NV2A_CRTC_REGISTER_INDEX
) = Index
;
127 return *((PUCHAR
) NV2A_CRTC_REGISTER_VALUE
);
133 /* Reuse framebuffer that was set up by firmware */
134 FrameBuffer
= (PVOID
)*((PULONG
) NV2A_CRTC_FRAMEBUFFER_START
);
135 /* Verify that framebuffer address is page-aligned */
136 ASSERT((ULONG_PTR
)FrameBuffer
% PAGE_SIZE
== 0);
138 /* FIXME: obtain fb size from firmware somehow (Cromwell reserves high 4 MB of RAM) */
139 FrameBufferSize
= 4 * 1024 * 1024;
141 ScreenWidth
= *((PULONG
) NV2A_RAMDAC_FP_HVALID_END
) + 1;
142 ScreenHeight
= *((PULONG
) NV2A_RAMDAC_FP_VVALID_END
) + 1;
143 /* Get BPP directly from NV2A CRTC (magic constants are from Cromwell) */
144 BytesPerPixel
= 8 * (((NvGetCrtc(0x19) & 0xE0) << 3) | (NvGetCrtc(0x13) & 0xFF)) / ScreenWidth
;
145 if (BytesPerPixel
== 4)
147 ASSERT((NvGetCrtc(0x28) & 0xF) == BytesPerPixel
- 1);
151 ASSERT((NvGetCrtc(0x28) & 0xF) == BytesPerPixel
);
153 Delta
= (ScreenWidth
* BytesPerPixel
+ 3) & ~ 0x3;
155 /* Verify screen resolution */
156 ASSERT(ScreenWidth
> 1);
157 ASSERT(ScreenHeight
> 1);
158 ASSERT(BytesPerPixel
>= 1 && BytesPerPixel
<= 4);
159 /* Verify that screen fits framebuffer size */
160 ASSERT(ScreenWidth
* ScreenHeight
* BytesPerPixel
<= FrameBufferSize
);
162 XboxVideoClearScreenColor(MAKE_COLOR(0, 0, 0), TRUE
);
166 XboxVideoSetDisplayMode(char *DisplayMode
, BOOLEAN Init
)
168 /* We only have one mode, semi-text */
169 return VideoTextMode
;
173 XboxVideoGetDisplaySize(PULONG Width
, PULONG Height
, PULONG Depth
)
175 *Width
= ScreenWidth
/ CHAR_WIDTH
;
176 *Height
= (ScreenHeight
- 2 * TOP_BOTTOM_LINES
) / CHAR_HEIGHT
;
181 XboxVideoGetBufferSize(VOID
)
183 return (ScreenHeight
- 2 * TOP_BOTTOM_LINES
) / CHAR_HEIGHT
* (ScreenWidth
/ CHAR_WIDTH
) * 2;
187 XboxVideoGetFontsFromFirmware(PULONG RomFontPointers
)
189 TRACE("XboxVideoGetFontsFromFirmware(): UNIMPLEMENTED\n");
193 XboxVideoSetTextCursorPosition(UCHAR X
, UCHAR Y
)
195 /* We don't have a cursor yet */
199 XboxVideoHideShowTextCursor(BOOLEAN Show
)
201 /* We don't have a cursor yet */
205 XboxVideoCopyOffScreenBufferToVRAM(PVOID Buffer
)
207 PUCHAR OffScreenBuffer
= (PUCHAR
) Buffer
;
210 for (Line
= 0; Line
< (ScreenHeight
- 2 * TOP_BOTTOM_LINES
) / CHAR_HEIGHT
; Line
++)
212 for (Col
= 0; Col
< ScreenWidth
/ CHAR_WIDTH
; Col
++)
214 XboxVideoPutChar(OffScreenBuffer
[0], OffScreenBuffer
[1], Col
, Line
);
215 OffScreenBuffer
+= 2;
221 XboxVideoIsPaletteFixed(VOID
)
227 XboxVideoSetPaletteColor(UCHAR Color
, UCHAR Red
, UCHAR Green
, UCHAR Blue
)
233 XboxVideoGetPaletteColor(UCHAR Color
, UCHAR
* Red
, UCHAR
* Green
, UCHAR
* Blue
)
247 /* Call PC version */
252 XboxVideoPrepareForReactOS(VOID
)
254 XboxVideoClearScreenColor(MAKE_COLOR(0, 0, 0), TRUE
);
255 XboxVideoHideShowTextCursor(FALSE
);