Files
net/platform/bdadetect.c
2025-12-20 18:49:21 -08:00

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);
}
}
}
}