| /* |
| * ----------------------------------------------------------------------- |
| * |
| * Copyright 1994-2008 H. Peter Anvin - All Rights Reserved |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation, Inc., 53 Temple Place Ste 330, |
| * Boston MA 02111-1307, USA; either version 2 of the License, or |
| * (at your option) any later version; incorporated herein by reference. |
| * |
| * ----------------------------------------------------------------------- |
| * |
| * |
| * bios.h |
| * |
| * Header file for the BIOS data structures etc. |
| */ |
| |
| #ifndef _BIOS_H |
| #define _BIOS_H |
| |
| #include <sys/io.h> |
| |
| /* |
| * Interrupt vectors |
| */ |
| #define BIOS_timer_hook (4 * 0x1C) |
| #define fdctab (4 * 0x1E) |
| #define fdctab1 fdctab |
| #define fdctab2 (fdctab + 2) |
| |
| #define SERIAL_BASE 0x0400 /* Base address for 4 serial ports */ |
| #define BIOS_fbm 0x0413 /* Free Base Memory (kilobytes) */ |
| #define BIOS_page 0x0462 /* Current video page */ |
| #define BIOS_timer 0x046C /* Timer ticks */ |
| #define BIOS_magic 0x0472 /* BIOS reset magic */ |
| #define BIOS_vidrows 0x0484 /* Number of screen rows */ |
| |
| static inline uint16_t bios_fbm(void) |
| { |
| return *(volatile uint16_t *)BIOS_fbm; |
| } |
| |
| static inline void set_bios_fbm(uint16_t mem) |
| { |
| *(volatile uint16_t *)BIOS_fbm = mem; |
| } |
| |
| #define serial_buf_size 4096 |
| #define IO_DELAY_PORT 0x80 /* Invalid port (we hope!) */ |
| |
| static inline void io_delay(void) |
| { |
| outb(0x0, IO_DELAY_PORT); |
| outb(0x0, IO_DELAY_PORT); |
| } |
| |
| /* |
| * Sometimes we need to access screen coordinates as separate 8-bit |
| * entities and sometimes we need to use them as 16-bit entities. Using |
| * this structure allows the compiler to do it for us. |
| */ |
| union screen { |
| struct { |
| uint8_t col; /* Cursor column for message file */ |
| uint8_t row; /* Cursor row for message file */ |
| } b; |
| uint16_t dx; |
| }; |
| extern union screen _cursor; |
| extern union screen _screensize; |
| |
| #define CursorDX _cursor.dx |
| #define CursorCol _cursor.b.col |
| #define CursorRow _cursor.b.row |
| |
| #define ScreenSize _screensize.dx |
| #define VidCols _screensize.b.col |
| #define VidRows _screensize.b.row |
| |
| /* font.c */ |
| extern void use_font(void); |
| extern void bios_adjust_screen(void); |
| |
| /* serirq.c */ |
| extern char *SerialHead; |
| extern char *SerialTail; |
| |
| extern void bios_init(void); |
| |
| static inline uint16_t get_serial_port(uint16_t port) |
| { |
| /* Magic array in BIOS memory, contains four entries */ |
| const uint16_t * const serial_ports = (const uint16_t *)SERIAL_BASE; |
| |
| /* |
| * If port > 3 then the port is simply the I/O base address |
| */ |
| if (port > 3) |
| return port; |
| |
| /* Get the I/O port from the BIOS */ |
| return serial_ports[port]; |
| } |
| |
| #endif /* _BIOS_H */ |