1 | /* |
---|
2 | * ----------------------------------------------------------------------- |
---|
3 | * |
---|
4 | * Copyright 1994-2008 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 | * bios.h |
---|
16 | * |
---|
17 | * Header file for the BIOS data structures etc. |
---|
18 | */ |
---|
19 | |
---|
20 | #ifndef _BIOS_H |
---|
21 | #define _BIOS_H |
---|
22 | |
---|
23 | #include <sys/io.h> |
---|
24 | |
---|
25 | /* |
---|
26 | * Interrupt vectors |
---|
27 | */ |
---|
28 | #define BIOS_timer_hook (4 * 0x1C) |
---|
29 | #define fdctab (4 * 0x1E) |
---|
30 | #define fdctab1 fdctab |
---|
31 | #define fdctab2 (fdctab + 2) |
---|
32 | |
---|
33 | #define SERIAL_BASE 0x0400 /* Base address for 4 serial ports */ |
---|
34 | #define BIOS_fbm 0x0413 /* Free Base Memory (kilobytes) */ |
---|
35 | #define BIOS_page 0x0462 /* Current video page */ |
---|
36 | #define BIOS_timer 0x046C /* Timer ticks */ |
---|
37 | #define BIOS_magic 0x0472 /* BIOS reset magic */ |
---|
38 | #define BIOS_vidrows 0x0484 /* Number of screen rows */ |
---|
39 | |
---|
40 | static inline uint16_t bios_fbm(void) |
---|
41 | { |
---|
42 | return *(volatile uint16_t *)BIOS_fbm; |
---|
43 | } |
---|
44 | |
---|
45 | static inline void set_bios_fbm(uint16_t mem) |
---|
46 | { |
---|
47 | *(volatile uint16_t *)BIOS_fbm = mem; |
---|
48 | } |
---|
49 | |
---|
50 | #define serial_buf_size 4096 |
---|
51 | #define IO_DELAY_PORT 0x80 /* Invalid port (we hope!) */ |
---|
52 | |
---|
53 | static inline void io_delay(void) |
---|
54 | { |
---|
55 | outb(0x0, IO_DELAY_PORT); |
---|
56 | outb(0x0, IO_DELAY_PORT); |
---|
57 | } |
---|
58 | |
---|
59 | /* |
---|
60 | * Sometimes we need to access screen coordinates as separate 8-bit |
---|
61 | * entities and sometimes we need to use them as 16-bit entities. Using |
---|
62 | * this structure allows the compiler to do it for us. |
---|
63 | */ |
---|
64 | union screen { |
---|
65 | struct { |
---|
66 | uint8_t col; /* Cursor column for message file */ |
---|
67 | uint8_t row; /* Cursor row for message file */ |
---|
68 | } b; |
---|
69 | uint16_t dx; |
---|
70 | }; |
---|
71 | extern union screen _cursor; |
---|
72 | extern union screen _screensize; |
---|
73 | |
---|
74 | #define CursorDX _cursor.dx |
---|
75 | #define CursorCol _cursor.b.col |
---|
76 | #define CursorRow _cursor.b.row |
---|
77 | |
---|
78 | #define ScreenSize _screensize.dx |
---|
79 | #define VidCols _screensize.b.col |
---|
80 | #define VidRows _screensize.b.row |
---|
81 | |
---|
82 | /* font.c */ |
---|
83 | extern void use_font(void); |
---|
84 | extern void bios_adjust_screen(void); |
---|
85 | |
---|
86 | /* serirq.c */ |
---|
87 | extern char *SerialHead; |
---|
88 | extern char *SerialTail; |
---|
89 | |
---|
90 | extern void bios_init(void); |
---|
91 | |
---|
92 | static inline uint16_t get_serial_port(uint16_t port) |
---|
93 | { |
---|
94 | /* Magic array in BIOS memory, contains four entries */ |
---|
95 | const uint16_t * const serial_ports = (const uint16_t *)SERIAL_BASE; |
---|
96 | |
---|
97 | /* |
---|
98 | * If port > 3 then the port is simply the I/O base address |
---|
99 | */ |
---|
100 | if (port > 3) |
---|
101 | return port; |
---|
102 | |
---|
103 | /* Get the I/O port from the BIOS */ |
---|
104 | return serial_ports[port]; |
---|
105 | } |
---|
106 | |
---|
107 | #endif /* _BIOS_H */ |
---|