Updated to REAL_CODE().
[gpxe.git] / src / arch / i386 / firmware / pcbios / bios_console.c
1 /*
2  * Copyright (C) 2006 Michael Brown <mbrown@fensystems.co.uk>.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of the
7  * License, or any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17  */
18
19 #include <realmode.h>
20 #include <console.h>
21
22 /**
23  * Print a character to BIOS console
24  *
25  * @v character         Character to be printed
26  */
27 static void bios_putchar ( int character ) {
28
29         __asm__ __volatile__ ( REAL_CODE ( "sti\n\t"
30                                            "int $0x10\n\t"
31                                            "cli\n\t" )
32                                : : "a" ( character | 0x0e00 ), "b" ( 1 )
33                                : "ebp" );
34 }
35
36 /**
37  * Get character from BIOS console
38  *
39  * @ret character       Character read from console
40  */
41 static int bios_getchar ( void ) {
42         uint8_t character;
43         
44         __asm__ __volatile__ ( REAL_CODE ( "sti\n\t"
45                                            "int $0x16\n\t"
46                                            "cli\n\t" )
47                                : "=a" ( character ) : "a" ( 0x0000 ) );
48
49         return character;
50 }
51
52 /**
53  * Check for character ready to read from BIOS console
54  *
55  * @ret True            Character available to read
56  * @ret False           No character available to read
57  */
58 static int bios_iskey ( void ) {
59         unsigned int discard_a;
60         unsigned int flags;
61         
62         __asm__ __volatile__ ( REAL_CODE ( "sti\n\t"
63                                            "int $0x16\n\t"
64                                            "pushfw\n\t"
65                                            "popw %w0\n\t"
66                                            "cli\n\t" )
67                                : "=r" ( flags ), "=a" ( discard_a )
68                                : "a" ( 0x0001 ) );
69         
70         return ( ! ( flags & ZF ) );
71 }
72
73 struct console_driver bios_console __console_driver = {
74         .putchar = bios_putchar,
75         .getchar = bios_getchar,
76         .iskey = bios_iskey,
77 };