Expand PMF_FN_* macros.
[netbsd-mini2440.git] / sys / arch / i386 / stand / lib / biosvbe.S
blobcde3e7e85f2ba64fb80e4ab679b5dba2cdc3449c
1 /* $NetBSD$ */
3 /*-
4  * Copyright (c) 2009 Jared D. McNeill <jmcneill@invisible.ca>
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26  * POSSIBILITY OF SUCH DAMAGE.
27  */
29 #include <machine/asm.h>
31         .text
34  * VESA BIOS Extensions routines
35  */
38  * Function 00h - Return VBE Controller Information
39  *
40  * int biosvbe_info(struct vbeinfoblock *)
41  * return: VBE call status
42  */
43 ENTRY(biosvbe_info)
44         pushl   %ebp
45         movl    %esp,%ebp
46         pushl   %ebx
47         pushl   %ecx
48         pushl   %edx
49         push    %esi
50         push    %edi
52         movl    8(%ebp), %edi   /* vbe info block address*/
54         call    _C_LABEL(prot_to_real)
55         .code16
57         push    %es
59         push    %di
60         shrl    $4, %edi
61         mov     %ds, %ax
62         add     %di, %ax
63         mov     %ax, %es
64         pop     %di
65         and     $0xf, %di       /* mode info block address now in es:di */
67         movw    $0x4f00, %ax    /* get vbe info block */
68         int     $0x10
70         pop     %es
72         calll   _C_LABEL(real_to_prot)
73         .code32
75         andl    $0xffff,%eax
77         pop     %edi
78         pop     %esi
79         popl    %edx
80         popl    %ecx
81         popl    %ebx
82         popl    %ebp
83         ret
86  * Function 01h - Return VBE Mode Information
87  *
88  * int biosvbe_get_mode_info(int mode, struct modeinfoblock *mi)
89  * return: VBE call status
90  */
91 ENTRY(biosvbe_get_mode_info)
92         pushl   %ebp
93         movl    %esp,%ebp
94         pushl   %ebx
95         pushl   %ecx
96         pushl   %edx
97         push    %esi
98         push    %edi
100         movl    8(%ebp), %ecx   /* mode number */
101         movl    12(%ebp), %edi  /* mode info block address */
103         call    _C_LABEL(prot_to_real)
104         .code16
106         push    %es
108         push    %di
109         shrl    $4, %edi
110         mov     %ds, %ax
111         add     %di, %ax
112         mov     %ax, %es
113         pop     %di
114         and     $0xf, %di       /* mode info block address now in es:di */
116         movw    $0x4f01, %ax    /* get mode info block */
117         int     $0x10
119         pop     %es
121         calll   _C_LABEL(real_to_prot)
122         .code32
124         andl    $0xffff,%eax
126         pop     %edi
127         pop     %esi
128         popl    %edx
129         popl    %ecx
130         popl    %ebx
131         popl    %ebp
132         ret
135  * Function 02h - Set VBE Mode
137  * int biosvbe_set_mode(int mode)
138  * return: VBE call status
139  */
140 ENTRY(biosvbe_set_mode)
141         pushl   %ebp
142         movl    %esp,%ebp
143         pushl   %ebx
144         pushl   %ecx
145         pushl   %edx
146         push    %esi
147         push    %edi
149         movl    8(%ebp), %ebx   /* mode number */
150         orl     $0x4000, %ebx
152         call    _C_LABEL(prot_to_real)
153         .code16
155         movw    $0x4f02, %ax    /* set mode */
156         int     $0x10
158         calll   _C_LABEL(real_to_prot)
159         .code32
161         andl    $0xffff,%eax
163         pop     %edi
164         pop     %esi
165         popl    %edx
166         popl    %ecx
167         popl    %ebx
168         popl    %ebp
169         ret
172  * Function 08h - Set/Get DAC Palette Format
174  * int biosvbe_palette_format(int format)
175  * return: VBE call status
176  */
177 ENTRY(biosvbe_palette_format)
178         pushl   %ebp
179         movl    %esp,%ebp
180         pushl   %ebx
181         pushl   %ecx
182         pushl   %edx
183         push    %esi
184         push    %edi
186         movl    8(%ebp), %ebx   /* mode number */
188         call    _C_LABEL(prot_to_real)
189         .code16
191         movw    $0x4f08, %ax    /* get/set palette format */
192         int     $0x10
194         calll   _C_LABEL(real_to_prot)
195         .code32
197         andl    $0xffff,%eax
199         pop     %edi
200         pop     %esi
201         popl    %edx
202         popl    %ecx
203         popl    %ebx
204         popl    %ebp
205         ret
208  * Function 09h - Set/Get Palette Data
210  * int biosvbe_palette_data(int mode, int reg, struct paletteentry *)
211  * return: VBE call status
212  */
213 ENTRY(biosvbe_palette_data)
214         pushl   %ebp
215         movl    %esp,%ebp
216         pushl   %ebx
217         pushl   %ecx
218         pushl   %edx
219         push    %esi
220         push    %edi
222         movl    8(%ebp), %ebx   /* mode number */
223         movl    12(%ebp), %edx  /* register */
224         movl    16(%ebp), %edi  /* palette entry address */
225         movl    $1, %ecx        /* # palette entries to update */
227         call    _C_LABEL(prot_to_real)
228         .code16
230         push    %es
232         push    %di
233         shrl    $4, %edi
234         mov     %ds, %ax
235         add     %di, %ax
236         mov     %ax, %es
237         pop     %di
238         and     $0xf, %di       /* palette entry address now in es:di */
240         movw    $0x4f09, %ax    /* get/set palette entry */
241         int     $0x10
243         pop     %es
245         calll   _C_LABEL(real_to_prot)
246         .code32
248         andl    $0xffff,%eax
250         pop     %edi
251         pop     %esi
252         popl    %edx
253         popl    %ecx
254         popl    %ebx
255         popl    %ebp
256         ret