Magellan Linux

Annotation of /trunk/mkinitrd-magellan/isolinux/graphics.inc

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1133 - (hide annotations) (download)
Thu Aug 19 09:50:43 2010 UTC (13 years, 8 months ago) by niro
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