/*
* -----------------------------------------------------------------------
*
* 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 */