56 lines
1.6 KiB
C
56 lines
1.6 KiB
C
#include <stddef.h>
|
|
#include <stdint.h>
|
|
#include <exec/mem.h>
|
|
#include <exec/detect.h>
|
|
|
|
#pragma pack(push,1)
|
|
struct BIOSDataArea {
|
|
uint16_t com_ports[4];
|
|
uint16_t lpt_ports[3];
|
|
uint16_t ebda_segment;
|
|
uint16_t device_flags;
|
|
uint16_t ebda_free_kb;
|
|
uint16_t keyboard_flags;
|
|
uint32_t keyboard_buffer[32];
|
|
uint8_t display_mode;
|
|
uint16_t text_mode_columns;
|
|
uint16_t video_io_port;
|
|
uint16_t timer_ticks;
|
|
uint8_t drives_detected;
|
|
uint16_t keyboard_buffer_start;
|
|
uint16_t keyboard_buffer_end;
|
|
uint8_t keyboard_shift_flags;
|
|
};
|
|
#pragma pack(pop)
|
|
|
|
static const uint16_t LPT_PORT_IRQS[3] = {7, 6, 5};
|
|
|
|
static struct BIOSDataArea *bda = (struct BIOSDataArea *)0x400;
|
|
|
|
void BDA_Detect(void) {
|
|
/* pclpt.device */
|
|
for (int i = 0; i < 3; i++) {
|
|
uint16_t lpt_port = bda->lpt_ports[i];
|
|
if (lpt_port) {
|
|
struct Detect *lpt_detect = CreateDetect("bda()pclpt()", 1, 1);
|
|
if (lpt_detect) {
|
|
SetDetectRegion(lpt_detect, 0, AS_IO, lpt_port, 8);
|
|
SetDetectIRQ(lpt_detect, 0, LPT_PORT_IRQS[i]);
|
|
AddDetect(lpt_detect);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* nsserial.device */
|
|
for (int i = 0; i < 3; i++) {
|
|
uint16_t com_port = bda->com_ports[i];
|
|
if (com_port) {
|
|
struct Detect *com_detect = CreateDetect("bda()nsserial()", 1, 1);
|
|
if (com_detect) {
|
|
SetDetectRegion(com_detect, 0, AS_IO, com_port, 8);
|
|
SetDetectIRQ(com_detect, 0, (i%2)?3:4);
|
|
AddDetect(com_detect);
|
|
}
|
|
}
|
|
}
|
|
} |