Annotation of /tags/mkinitrd-6_4_0/isolinux/graphics.inc
Parent Directory | Revision Log
Revision 1133 -
(hide annotations)
(download)
Thu Aug 19 09:50:43 2010 UTC (14 years, 1 month ago) by niro
Original Path: trunk/mkinitrd-magellan/isolinux/graphics.inc
File size: 6942 byte(s)
Thu Aug 19 09:50:43 2010 UTC (14 years, 1 month ago) by niro
Original Path: trunk/mkinitrd-magellan/isolinux/graphics.inc
File size: 6942 byte(s)
-updated to isolinux-3.86
1 | niro | 532 | ;; ----------------------------------------------------------------------- |
2 | ;; | ||
3 | niro | 1133 | ;; Copyright 1994-2008 H. Peter Anvin - All Rights Reserved |
4 | ;; | ||
5 | niro | 532 | ;; This program is free software; you can redistribute it and/or modify |
6 | ;; it under the terms of the GNU General Public License as published by | ||
7 | ;; the Free Software Foundation, Inc., 53 Temple Place Ste 330, | ||
8 | ;; Boston MA 02111-1307, USA; either version 2 of the License, or | ||
9 | ;; (at your option) any later version; incorporated herein by reference. | ||
10 | ;; | ||
11 | ;; ----------------------------------------------------------------------- | ||
12 | |||
13 | ; ---------------------------------------------------------------------------- | ||
14 | ; VGA splash screen code | ||
15 | ; ---------------------------------------------------------------------------- | ||
16 | |||
17 | ; | ||
18 | ; vgadisplayfile: | ||
19 | ; Display a graphical splash screen. | ||
20 | niro | 1133 | ; The file is already opened on the top of the getc stack. |
21 | niro | 532 | ; |
22 | niro | 1133 | ; Assumes CS == DS == ES. |
23 | niro | 532 | ; |
24 | section .text | ||
25 | |||
26 | vgadisplayfile: | ||
27 | ; This is a cheap and easy way to make sure the screen is | ||
28 | ; cleared in case we were in graphics mode already | ||
29 | call vgaclearmode | ||
30 | call vgasetmode | ||
31 | jnz .error_nz | ||
32 | |||
33 | .graphalready: | ||
34 | niro | 1133 | ; Load the header. |
35 | mov cx,4+2*2+16*3 | ||
36 | mov di,LSSHeader | ||
37 | .gethdr: | ||
38 | call getc | ||
39 | stosb | ||
40 | loop .gethdr | ||
41 | jc .error | ||
42 | niro | 532 | |
43 | ; The header WILL be in the first chunk. | ||
44 | niro | 1133 | cmp dword [LSSMagic],0x1413f33d ; Magic number |
45 | niro | 532 | .error_nz: jne .error |
46 | |||
47 | niro | 1133 | mov dx,GraphColorMap ; Color map offset |
48 | niro | 532 | mov ax,1012h ; Set RGB registers |
49 | xor bx,bx ; First register number | ||
50 | mov cx,16 ; 16 registers | ||
51 | int 10h | ||
52 | niro | 1133 | |
53 | niro | 532 | .movecursor: |
54 | niro | 1133 | mov ax,[GraphYSize] ; Number of pixel rows |
55 | niro | 532 | mov dx,[VGAFontSize] |
56 | add ax,dx | ||
57 | dec ax | ||
58 | div dl | ||
59 | xor dx,dx ; Set column to 0 | ||
60 | cmp al,[VidRows] | ||
61 | jb .rowsok | ||
62 | mov al,[VidRows] | ||
63 | dec al | ||
64 | .rowsok: | ||
65 | mov dh,al | ||
66 | mov ah,2 | ||
67 | xor bx,bx | ||
68 | int 10h ; Set cursor below image | ||
69 | |||
70 | niro | 1133 | mov cx,[GraphYSize] ; Number of graphics rows |
71 | niro | 532 | mov word [VGAPos],0 |
72 | |||
73 | .drawpixelrow: | ||
74 | push cx | ||
75 | niro | 1133 | mov di,VGARowBuffer |
76 | ; Pre-clear the row buffer | ||
77 | push di | ||
78 | push di | ||
79 | mov cx,640/4 | ||
80 | xor eax,eax | ||
81 | rep stosd | ||
82 | pop di | ||
83 | niro | 532 | mov cx,[GraphXSize] |
84 | call rledecode ; Decode one row | ||
85 | niro | 1133 | pop si |
86 | mov di,VGAPlaneBuffer | ||
87 | push di | ||
88 | mov bp,640 | ||
89 | call packedpixel2vga | ||
90 | pop si | ||
91 | push es | ||
92 | niro | 532 | mov di,0A000h ; VGA segment |
93 | mov es,di | ||
94 | mov di,[VGAPos] | ||
95 | niro | 1133 | call outputvga |
96 | niro | 532 | pop es |
97 | niro | 1133 | add word [VGAPos],640/8 |
98 | niro | 532 | pop cx |
99 | loop .drawpixelrow | ||
100 | |||
101 | .error: | ||
102 | niro | 1133 | jmp close ; Tailcall! |
103 | niro | 532 | |
104 | ; | ||
105 | ; rledecode: | ||
106 | ; Decode a pixel row in RLE16 format. | ||
107 | ; | ||
108 | niro | 1133 | ; getc stack -> input |
109 | ; CX -> pixel count | ||
110 | ; ES:DI -> output (packed pixel) | ||
111 | niro | 532 | ; |
112 | rledecode: | ||
113 | niro | 1133 | xor dx,dx ; DL = last pixel, DH = nybble buffer |
114 | niro | 532 | .loop: |
115 | call .getnybble | ||
116 | cmp al,dl | ||
117 | je .run ; Start of run sequence | ||
118 | stosb | ||
119 | mov dl,al | ||
120 | dec cx | ||
121 | jnz .loop | ||
122 | .done: | ||
123 | ret | ||
124 | .run: | ||
125 | xor bx,bx | ||
126 | call .getnybble | ||
127 | niro | 1133 | or bl,al |
128 | niro | 532 | jz .longrun |
129 | .dorun: | ||
130 | push cx | ||
131 | mov cx,bx | ||
132 | mov al,dl | ||
133 | rep stosb | ||
134 | pop cx | ||
135 | sub cx,bx | ||
136 | ja .loop | ||
137 | jmp short .done | ||
138 | .longrun: | ||
139 | call .getnybble | ||
140 | niro | 1133 | mov bl,al |
141 | niro | 532 | call .getnybble |
142 | shl al,4 | ||
143 | niro | 1133 | or bl,al |
144 | niro | 532 | add bx,16 |
145 | jmp short .dorun | ||
146 | niro | 1133 | |
147 | niro | 532 | .getnybble: |
148 | niro | 1133 | test dh,10h |
149 | jz .low | ||
150 | and dh,0Fh | ||
151 | mov al,dh | ||
152 | ret | ||
153 | .low: | ||
154 | call getc | ||
155 | mov dh,al | ||
156 | shr dh,4 | ||
157 | or dh,10h ; Nybble already read | ||
158 | niro | 532 | and al,0Fh |
159 | ret | ||
160 | |||
161 | ; | ||
162 | ; packedpixel2vga: | ||
163 | ; Convert packed-pixel to VGA bitplanes | ||
164 | ; | ||
165 | niro | 1133 | ; DS:SI -> packed pixel string |
166 | niro | 532 | ; BP -> pixel count (multiple of 8) |
167 | niro | 1133 | ; DS:DI -> output (four planes) |
168 | niro | 532 | ; |
169 | packedpixel2vga: | ||
170 | niro | 1133 | xor cx,cx |
171 | niro | 532 | .planeloop: |
172 | niro | 1133 | inc cx |
173 | push si | ||
174 | push bp | ||
175 | niro | 532 | .loop1: |
176 | niro | 1133 | mov bx,8 |
177 | niro | 532 | .loop2: |
178 | niro | 1133 | lodsb |
179 | niro | 532 | shr al,cl |
180 | niro | 1133 | rcl dl,1 ; VGA is bigendian. Sigh. |
181 | dec bx | ||
182 | jnz .loop2 | ||
183 | mov [di],dl | ||
184 | inc di | ||
185 | niro | 532 | sub bp,byte 8 |
186 | ja .loop1 | ||
187 | niro | 1133 | pop bp |
188 | pop si | ||
189 | cmp cl,3 | ||
190 | niro | 532 | jbe .planeloop |
191 | ret | ||
192 | |||
193 | ; | ||
194 | niro | 1133 | ; outputvga: |
195 | ; Output four subsequent lines of VGA data | ||
196 | ; | ||
197 | ; DS:SI -> four planes @ 640/8=80 bytes | ||
198 | ; ES:DI -> pointer into VGA memory | ||
199 | ; | ||
200 | outputvga: | ||
201 | mov dx,3C4h ; VGA Sequencer Register select port | ||
202 | mov al,2 ; Sequencer mask | ||
203 | out dx,al ; Select the sequencer mask | ||
204 | inc dx ; VGA Sequencer Register data port | ||
205 | dec ax ; AL <- 1 | ||
206 | .loop1: | ||
207 | out dx,al ; Select the bit plane to write | ||
208 | push di | ||
209 | mov cx,640/32 | ||
210 | rep movsd | ||
211 | pop di | ||
212 | add ax,ax | ||
213 | cmp al,8 | ||
214 | jbe .loop1 | ||
215 | ret | ||
216 | |||
217 | ; | ||
218 | niro | 532 | ; vgasetmode: |
219 | ; Enable VGA graphics, if possible; return ZF=1 on success | ||
220 | ; DS must be set to the base segment; ES is set to DS. | ||
221 | ; | ||
222 | vgasetmode: | ||
223 | push ds | ||
224 | pop es | ||
225 | niro | 1133 | mov al,[UsingVGA] |
226 | cmp al,01h | ||
227 | je .success ; Nothing to do... | ||
228 | test al,04h | ||
229 | jz .notvesa | ||
230 | ; We're in a VESA mode, which means VGA; use VESA call | ||
231 | ; to revert the mode, and then call the conventional | ||
232 | ; mode-setting for good measure... | ||
233 | mov ax,4F02h | ||
234 | mov bx,0012h | ||
235 | int 10h | ||
236 | jmp .setmode | ||
237 | .notvesa: | ||
238 | niro | 532 | mov ax,1A00h ; Get video card and monitor |
239 | xor bx,bx | ||
240 | int 10h | ||
241 | sub bl, 7 ; BL=07h and BL=08h OK | ||
242 | cmp bl, 1 | ||
243 | ja .error ; ZF=0 | ||
244 | ; mov bx,TextColorReg | ||
245 | ; mov dx,1009h ; Read color registers | ||
246 | ; int 10h | ||
247 | niro | 1133 | .setmode: |
248 | niro | 532 | mov ax,0012h ; Set mode = 640x480 VGA 16 colors |
249 | int 10h | ||
250 | mov dx,linear_color | ||
251 | mov ax,1002h ; Write color registers | ||
252 | int 10h | ||
253 | mov [UsingVGA], byte 1 | ||
254 | |||
255 | niro | 1133 | ; Set GXPixCols and GXPixRows |
256 | mov dword [GXPixCols],640+(480 << 16) | ||
257 | |||
258 | niro | 532 | call use_font ; Set graphics font/data |
259 | mov byte [ScrollAttribute], 00h | ||
260 | |||
261 | niro | 1133 | .success: |
262 | niro | 532 | xor ax,ax ; Set ZF |
263 | .error: | ||
264 | ret | ||
265 | |||
266 | ; | ||
267 | ; vgaclearmode: | ||
268 | ; Disable VGA graphics. It is not safe to assume any value | ||
269 | ; for DS or ES. | ||
270 | ; | ||
271 | vgaclearmode: | ||
272 | push ds | ||
273 | push es | ||
274 | pushad | ||
275 | mov ax,cs | ||
276 | mov ds,ax | ||
277 | mov es,ax | ||
278 | niro | 1133 | mov al,[UsingVGA] |
279 | and al,al ; Already in text mode? | ||
280 | jz .done | ||
281 | test al,04h | ||
282 | jz .notvesa | ||
283 | mov ax,4F02h ; VESA return to normal video mode | ||
284 | mov bx,0003h | ||
285 | int 10h | ||
286 | .notvesa: | ||
287 | niro | 532 | mov ax,0003h ; Return to normal video mode |
288 | int 10h | ||
289 | ; mov dx,TextColorReg ; Restore color registers | ||
290 | ; mov ax,1002h | ||
291 | ; int 10h | ||
292 | mov [UsingVGA], byte 0 | ||
293 | |||
294 | niro | 1133 | mov byte [ScrollAttribute], 07h |
295 | niro | 532 | call use_font ; Restore text font/data |
296 | .done: | ||
297 | popad | ||
298 | pop es | ||
299 | pop ds | ||
300 | ret | ||
301 | |||
302 | ; | ||
303 | ; vgashowcursor/vgahidecursor: | ||
304 | ; If VGA graphics is enabled, draw a cursor/clear a cursor | ||
305 | ; | ||
306 | vgashowcursor: | ||
307 | pushad | ||
308 | mov al,'_' | ||
309 | jmp short vgacursorcommon | ||
310 | vgahidecursor: | ||
311 | pushad | ||
312 | mov al,' ' | ||
313 | vgacursorcommon: | ||
314 | cmp [UsingVGA], byte 1 | ||
315 | jne .done | ||
316 | mov ah,09h | ||
317 | mov bx,0007h | ||
318 | mov cx,1 | ||
319 | int 10h | ||
320 | .done: | ||
321 | popad | ||
322 | ret | ||
323 | |||
324 | |||
325 | section .data | ||
326 | ; Map colors to consecutive DAC registers | ||
327 | linear_color db 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0 | ||
328 | niro | 1133 | |
329 | ; See comboot.doc, INT 22h AX=0017h for the semantics | ||
330 | ; of this byte. | ||
331 | niro | 532 | UsingVGA db 0 |
332 | |||
333 | niro | 1133 | section .bss2 |
334 | alignb 4 | ||
335 | LSSHeader equ $ | ||
336 | LSSMagic resd 1 ; Magic number | ||
337 | niro | 532 | GraphXSize resw 1 ; Width of splash screen file |
338 | niro | 1133 | GraphYSize resw 1 ; Height of splash screen file |
339 | GraphColorMap resb 3*16 | ||
340 | niro | 532 | VGAPos resw 1 ; Pointer into VGA memory |
341 | VGAFilePtr resw 1 ; Pointer into VGAFileBuf | ||
342 | niro | 1133 | ; TextColorReg resb 17 ; VGA color registers for text mode |
343 | niro | 532 | %if IS_SYSLINUX |
344 | VGAFileBuf resb FILENAME_MAX+2 ; Unmangled VGA image name | ||
345 | %else | ||
346 | VGAFileBuf resb FILENAME_MAX ; Unmangled VGA image name | ||
347 | %endif | ||
348 | VGAFileBufEnd equ $ | ||
349 | VGAFileMBuf resb FILENAME_MAX ; Mangled VGA image name | ||
350 | |||
351 | niro | 1133 | alignb 4 |
352 | VGARowBuffer resb 640+80 ; Decompression buffer | ||
353 | VGAPlaneBuffer resb (640/8)*4 ; Plane buffers |