From 9b380041e6ad178f96942fd3b2521c1aba21a068 Mon Sep 17 00:00:00 2001 From: Richard Qin Date: Mon, 9 Nov 2026 01:57:05 +0800 Subject: [mubios] Add EDD parameters and normalize PS/2 input --- mubios/services/int13.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++ mubios/services/int16.c | 14 +++++++++++- 2 files changed, 70 insertions(+), 1 deletion(-) (limited to 'mubios/services') diff --git a/mubios/services/int13.c b/mubios/services/int13.c index 2c12261..73d553b 100644 --- a/mubios/services/int13.c +++ b/mubios/services/int13.c @@ -35,6 +35,19 @@ struct edd_packet u32 lba_high; } __attribute__ ((packed)); +struct edd_parameters +{ + u16 size; + u16 flags; + u32 cylinders_low; + u32 cylinders_high; + u32 heads; + u32 sectors_per_track; + u32 total_sectors_low; + u32 total_sectors_high; + u16 bytes_per_sector; +} __attribute__ ((packed)); + static void int13_fail (struct bios_regs *regs) { @@ -51,6 +64,15 @@ get_edd_packet (struct bios_regs *regs) return (struct edd_packet *)address; } +static struct edd_parameters * +get_edd_parameters (struct bios_regs *regs) +{ + u32 address; + + address = ((u32)regs->ds << 4) + (u16)regs->esi; + return (struct edd_parameters *)address; +} + void int13_service (struct bios_regs *regs) { @@ -103,5 +125,40 @@ int13_service (struct bios_regs *regs) return; } + if (function == 0x48u) + { + struct edd_parameters *parameters; + u16 cylinders; + u16 heads; + u16 sectors_per_track; + u32 total_sectors_low; + u32 total_sectors_high; + + parameters = get_edd_parameters (regs); + + if (parameters->size < 0x001Eu + || ata_identify (&cylinders, &heads, §ors_per_track, + &total_sectors_low, &total_sectors_high) + != 0) + { + int13_fail (regs); + return; + } + + parameters->size = 0x001Eu; + parameters->flags = 0; + parameters->cylinders_low = cylinders; + parameters->cylinders_high = 0; + parameters->heads = heads; + parameters->sectors_per_track = sectors_per_track; + parameters->total_sectors_low = total_sectors_low; + parameters->total_sectors_high = total_sectors_high; + parameters->bytes_per_sector = 512; + + regs->eax = 0; + regs->flags &= (u16)~BIOS_CF; + return; + } + int13_fail (regs); } diff --git a/mubios/services/int16.c b/mubios/services/int16.c index 4a04828..5872fb1 100644 --- a/mubios/services/int16.c +++ b/mubios/services/int16.c @@ -26,6 +26,18 @@ #define BDA_KBD_BUFFER_START 0x001Eu #define BDA_KBD_BUFFER_END 0x003Eu +static u8 +normalize_scancode (u8 scancode) +{ + switch (scancode) + { + case 0x5Au: + return 0x1Cu; + default: + return scancode; + } +} + static u8 scancode_to_ascii (u8 scancode) { @@ -126,7 +138,7 @@ int16_service (struct bios_regs *regs) position = *head; value = buffer[(position - BDA_KBD_BUFFER_START) >> 1]; - scancode = (u8)(value >> 8); + scancode = normalize_scancode ((u8)(value >> 8)); ascii = scancode_to_ascii (scancode); regs->eax = ((u32)scancode << 8) | ascii; -- cgit v1.2.3