Annotation of /trunk/mkinitrd-magellan/isolinux/graphics.inc
Parent Directory | Revision Log
Revision 532 -
(hide annotations)
(download)
Sat Sep 1 22:45:15 2007 UTC (17 years ago) by niro
File size: 6582 byte(s)
Sat Sep 1 22:45:15 2007 UTC (17 years ago) by niro
File size: 6582 byte(s)
-import if magellan mkinitrd; it is a fork of redhats mkinitrd-5.0.8 with all magellan patches and features; deprecates magellan-src/mkinitrd
1 | niro | 532 | ;; $Id: graphics.inc,v 1.1 2007-09-01 22:44:04 niro Exp $ |
2 | ;; ----------------------------------------------------------------------- | ||
3 | ;; | ||
4 | ;; Copyright 1994-2002 H. Peter Anvin - All Rights Reserved | ||
5 | ;; | ||
6 | ;; This program is free software; you can redistribute it and/or modify | ||
7 | ;; it under the terms of the GNU General Public License as published by | ||
8 | ;; the Free Software Foundation, Inc., 53 Temple Place Ste 330, | ||
9 | ;; Boston MA 02111-1307, USA; either version 2 of the License, or | ||
10 | ;; (at your option) any later version; incorporated herein by reference. | ||
11 | ;; | ||
12 | ;; ----------------------------------------------------------------------- | ||
13 | |||
14 | ; ---------------------------------------------------------------------------- | ||
15 | ; VGA splash screen code | ||
16 | ; ---------------------------------------------------------------------------- | ||
17 | |||
18 | ; | ||
19 | ; vgadisplayfile: | ||
20 | ; Display a graphical splash screen. | ||
21 | ; | ||
22 | ; Input: | ||
23 | ; | ||
24 | ; SI = cluster/socket pointer | ||
25 | ; | ||
26 | section .text | ||
27 | |||
28 | vgadisplayfile: | ||
29 | mov [VGACluster],si | ||
30 | push es | ||
31 | |||
32 | ; This is a cheap and easy way to make sure the screen is | ||
33 | ; cleared in case we were in graphics mode already | ||
34 | call vgaclearmode | ||
35 | call vgasetmode | ||
36 | jnz .error_nz | ||
37 | |||
38 | .graphalready: | ||
39 | mov ax,xfer_buf_seg ; Use as temporary storage | ||
40 | mov es,ax | ||
41 | mov fs,ax | ||
42 | |||
43 | call vgagetchunk ; Get the first chunk | ||
44 | |||
45 | ; The header WILL be in the first chunk. | ||
46 | cmp dword [es:xbs_vgabuf],0x1413f33d ; Magic number | ||
47 | .error_nz: jne .error | ||
48 | mov ax,[es:xbs_vgabuf+4] | ||
49 | mov [GraphXSize],ax | ||
50 | |||
51 | mov dx,xbs_vgabuf+8 ; Color map offset | ||
52 | mov ax,1012h ; Set RGB registers | ||
53 | xor bx,bx ; First register number | ||
54 | mov cx,16 ; 16 registers | ||
55 | int 10h | ||
56 | |||
57 | .movecursor: | ||
58 | mov ax,[es:xbs_vgabuf+6] ; Number of pixel rows | ||
59 | mov dx,[VGAFontSize] | ||
60 | add ax,dx | ||
61 | dec ax | ||
62 | div dl | ||
63 | xor dx,dx ; Set column to 0 | ||
64 | cmp al,[VidRows] | ||
65 | jb .rowsok | ||
66 | mov al,[VidRows] | ||
67 | dec al | ||
68 | .rowsok: | ||
69 | mov dh,al | ||
70 | mov ah,2 | ||
71 | xor bx,bx | ||
72 | int 10h ; Set cursor below image | ||
73 | |||
74 | mov cx,[es:xbs_vgabuf+6] ; Number of graphics rows | ||
75 | |||
76 | mov si,xbs_vgabuf+8+3*16 ; Beginning of pixel data | ||
77 | mov word [VGAPos],0 | ||
78 | |||
79 | .drawpixelrow: | ||
80 | push cx | ||
81 | mov cx,[GraphXSize] | ||
82 | mov di,xbs_vgatmpbuf ; Row buffer | ||
83 | call rledecode ; Decode one row | ||
84 | push si | ||
85 | mov si,xbs_vgatmpbuf | ||
86 | mov di,si | ||
87 | add di,[GraphXSize] | ||
88 | mov cx,640/4 | ||
89 | xor eax,eax | ||
90 | rep stosd ; Clear rest of row | ||
91 | mov di,0A000h ; VGA segment | ||
92 | mov es,di | ||
93 | mov di,[VGAPos] | ||
94 | mov bp,640 | ||
95 | call packedpixel2vga | ||
96 | add word [VGAPos],byte 80 ; Advance to next pixel row | ||
97 | push fs | ||
98 | pop es | ||
99 | pop si | ||
100 | pop cx | ||
101 | loop .drawpixelrow | ||
102 | |||
103 | .error: | ||
104 | pop es | ||
105 | ret | ||
106 | |||
107 | ; | ||
108 | ; rledecode: | ||
109 | ; Decode a pixel row in RLE16 format. | ||
110 | ; | ||
111 | ; FS:SI -> input | ||
112 | ; CX -> pixel count | ||
113 | ; ES:DI -> output (packed pixel) | ||
114 | ; | ||
115 | rledecode: | ||
116 | shl esi,1 ; Nybble pointer | ||
117 | xor dl,dl ; Last pixel | ||
118 | .loop: | ||
119 | call .getnybble | ||
120 | cmp al,dl | ||
121 | je .run ; Start of run sequence | ||
122 | stosb | ||
123 | mov dl,al | ||
124 | dec cx | ||
125 | jnz .loop | ||
126 | .done: | ||
127 | shr esi,1 | ||
128 | adc si,byte 0 | ||
129 | ret | ||
130 | .run: | ||
131 | xor bx,bx | ||
132 | call .getnybble | ||
133 | and al,al | ||
134 | jz .longrun | ||
135 | mov bl,al | ||
136 | .dorun: | ||
137 | push cx | ||
138 | mov cx,bx | ||
139 | mov al,dl | ||
140 | rep stosb | ||
141 | pop cx | ||
142 | sub cx,bx | ||
143 | ja .loop | ||
144 | jmp short .done | ||
145 | .longrun: | ||
146 | call .getnybble | ||
147 | mov ah,al | ||
148 | call .getnybble | ||
149 | shl al,4 | ||
150 | or al,ah | ||
151 | mov bl,al | ||
152 | add bx,16 | ||
153 | jmp short .dorun | ||
154 | .getnybble: | ||
155 | shr esi,1 | ||
156 | fs lodsb | ||
157 | jc .high | ||
158 | dec si | ||
159 | and al,0Fh | ||
160 | stc | ||
161 | rcl esi,1 | ||
162 | ret | ||
163 | .high: | ||
164 | shr al,4 | ||
165 | cmp si,xbs_vgabuf+trackbufsize ; Chunk overrun | ||
166 | jb .nonewchunk | ||
167 | call vgagetchunk | ||
168 | mov si,xbs_vgabuf ; Start at beginning of buffer | ||
169 | .nonewchunk: | ||
170 | shl esi,1 | ||
171 | ret | ||
172 | |||
173 | ; | ||
174 | ; vgagetchunk: | ||
175 | ; Get a new trackbufsize chunk of VGA image data | ||
176 | ; | ||
177 | ; On input, ES is assumed to point to the buffer segment. | ||
178 | ; | ||
179 | vgagetchunk: | ||
180 | pushad | ||
181 | mov si,[VGACluster] | ||
182 | and si,si | ||
183 | jz .eof ; EOF overrun, not much to do... | ||
184 | |||
185 | mov cx,[BufSafe] ; One trackbuf worth of data | ||
186 | mov bx,xbs_vgabuf | ||
187 | call getfssec | ||
188 | |||
189 | jnc .noteof | ||
190 | xor si,si | ||
191 | .noteof: mov [VGACluster],si | ||
192 | |||
193 | .eof: popad | ||
194 | ret | ||
195 | |||
196 | ; | ||
197 | ; packedpixel2vga: | ||
198 | ; Convert packed-pixel to VGA bitplanes | ||
199 | ; | ||
200 | ; FS:SI -> packed pixel string | ||
201 | ; BP -> pixel count (multiple of 8) | ||
202 | ; ES:DI -> output | ||
203 | ; | ||
204 | packedpixel2vga: | ||
205 | mov dx,3C4h ; VGA Sequencer Register select port | ||
206 | mov al,2 ; Sequencer mask | ||
207 | out dx,al ; Select the sequencer mask | ||
208 | inc dx ; VGA Sequencer Register data port | ||
209 | mov al,1 | ||
210 | mov bl,al | ||
211 | .planeloop: | ||
212 | pusha | ||
213 | out dx,al | ||
214 | .loop1: | ||
215 | mov cx,8 | ||
216 | .loop2: | ||
217 | xchg cx,bx | ||
218 | fs lodsb | ||
219 | shr al,cl | ||
220 | rcl ch,1 ; VGA is bigendian. Sigh. | ||
221 | xchg cx,bx | ||
222 | loop .loop2 | ||
223 | mov al,bh | ||
224 | stosb | ||
225 | sub bp,byte 8 | ||
226 | ja .loop1 | ||
227 | popa | ||
228 | inc bl | ||
229 | shl al,1 | ||
230 | cmp bl,4 | ||
231 | jbe .planeloop | ||
232 | ret | ||
233 | |||
234 | ; | ||
235 | ; vgasetmode: | ||
236 | ; Enable VGA graphics, if possible; return ZF=1 on success | ||
237 | ; DS must be set to the base segment; ES is set to DS. | ||
238 | ; | ||
239 | vgasetmode: | ||
240 | push ds | ||
241 | pop es | ||
242 | mov ax,1A00h ; Get video card and monitor | ||
243 | xor bx,bx | ||
244 | int 10h | ||
245 | sub bl, 7 ; BL=07h and BL=08h OK | ||
246 | cmp bl, 1 | ||
247 | ja .error ; ZF=0 | ||
248 | ; mov bx,TextColorReg | ||
249 | ; mov dx,1009h ; Read color registers | ||
250 | ; int 10h | ||
251 | mov ax,0012h ; Set mode = 640x480 VGA 16 colors | ||
252 | int 10h | ||
253 | mov dx,linear_color | ||
254 | mov ax,1002h ; Write color registers | ||
255 | int 10h | ||
256 | mov [UsingVGA], byte 1 | ||
257 | |||
258 | call use_font ; Set graphics font/data | ||
259 | mov byte [ScrollAttribute], 00h | ||
260 | |||
261 | xor ax,ax ; Set ZF | ||
262 | .error: | ||
263 | ret | ||
264 | |||
265 | ; | ||
266 | ; vgaclearmode: | ||
267 | ; Disable VGA graphics. It is not safe to assume any value | ||
268 | ; for DS or ES. | ||
269 | ; | ||
270 | vgaclearmode: | ||
271 | push ds | ||
272 | push es | ||
273 | pushad | ||
274 | mov ax,cs | ||
275 | mov ds,ax | ||
276 | mov es,ax | ||
277 | cmp [UsingVGA], byte 1 | ||
278 | jne .done | ||
279 | mov ax,0003h ; Return to normal video mode | ||
280 | int 10h | ||
281 | ; mov dx,TextColorReg ; Restore color registers | ||
282 | ; mov ax,1002h | ||
283 | ; int 10h | ||
284 | mov [UsingVGA], byte 0 | ||
285 | |||
286 | call use_font ; Restore text font/data | ||
287 | mov byte [ScrollAttribute], 07h | ||
288 | .done: | ||
289 | popad | ||
290 | pop es | ||
291 | pop ds | ||
292 | ret | ||
293 | |||
294 | ; | ||
295 | ; vgashowcursor/vgahidecursor: | ||
296 | ; If VGA graphics is enabled, draw a cursor/clear a cursor | ||
297 | ; | ||
298 | vgashowcursor: | ||
299 | pushad | ||
300 | mov al,'_' | ||
301 | jmp short vgacursorcommon | ||
302 | vgahidecursor: | ||
303 | pushad | ||
304 | mov al,' ' | ||
305 | vgacursorcommon: | ||
306 | cmp [UsingVGA], byte 1 | ||
307 | jne .done | ||
308 | mov ah,09h | ||
309 | mov bx,0007h | ||
310 | mov cx,1 | ||
311 | int 10h | ||
312 | .done: | ||
313 | popad | ||
314 | ret | ||
315 | |||
316 | |||
317 | section .data | ||
318 | ; Map colors to consecutive DAC registers | ||
319 | linear_color db 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0 | ||
320 | UsingVGA db 0 | ||
321 | |||
322 | section .latebss | ||
323 | alignb 2 | ||
324 | GraphXSize resw 1 ; Width of splash screen file | ||
325 | VGAPos resw 1 ; Pointer into VGA memory | ||
326 | VGACluster resw 1 ; Cluster pointer for VGA image file | ||
327 | VGAFilePtr resw 1 ; Pointer into VGAFileBuf | ||
328 | TextColorReg resb 17 ; VGA color registers for text mode | ||
329 | %if IS_SYSLINUX | ||
330 | VGAFileBuf resb FILENAME_MAX+2 ; Unmangled VGA image name | ||
331 | %else | ||
332 | VGAFileBuf resb FILENAME_MAX ; Unmangled VGA image name | ||
333 | %endif | ||
334 | VGAFileBufEnd equ $ | ||
335 | VGAFileMBuf resb FILENAME_MAX ; Mangled VGA image name | ||
336 |