Magellan Linux

Contents of /tags/mkinitrd-6.1.5/isolinux/graphics.inc

Parent Directory Parent Directory | Revision Log Revision Log


Revision 898 - (show annotations) (download)
Wed Aug 5 17:52:14 2009 UTC (14 years, 9 months ago) by niro
File size: 6582 byte(s)
tagged 'mkinitrd-6.1.5'
1 ;; $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