aboutsummaryrefslogtreecommitdiff
path: root/mubios/services/int13.c
diff options
context:
space:
mode:
authorRichard Qin <richard.qin.x@gmail.com>2026-11-10 01:16:40 +0800
committerRichard Qin <richard.qin.x@gmail.com>2026-11-10 01:16:40 +0800
commit4a9624da0c7cf0c27a00e1ff497d13f2e4a0d03e (patch)
tree91b95e736fa08a071e7814872fc822c2d3fcd682 /mubios/services/int13.c
parent9f45c30789b6133d4b5fb4ef07f0818a3ea4de48 (diff)
downloadrcc-project-4a9624da0c7cf0c27a00e1ff497d13f2e4a0d03e.tar.gz
rcc-project-4a9624da0c7cf0c27a00e1ff497d13f2e4a0d03e.tar.xz
[mubios] Implement serial input and BIOS console key handling
Implement UART receive, transmit timeouts, configuration and status reporting for INT 14h functions 00h-03h. Initialize the BDA serial timeout and expose the driver interfaces. Translate terminal characters and CSI/SS3 escape sequences into BIOS keyboard events for INT 16h. Add blocking reads, non-consuming status queries, enhanced key reads and keyboard buffer insertion.
Diffstat (limited to 'mubios/services/int13.c')
-rw-r--r--mubios/services/int13.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/mubios/services/int13.c b/mubios/services/int13.c
index 033a045..7186377 100644
--- a/mubios/services/int13.c
+++ b/mubios/services/int13.c
@@ -137,9 +137,9 @@ int13_service (struct bios_regs *regs)
head = (u8)(regs->edx >> 8);
if ((regs->edx & 0x00FFu) != BIOS_HARD_DISK || count == 0u
- || get_ata_geometry (&geometry) != 0
- || sector == 0u || sector > geometry.sectors_per_track
- || head >= geometry.heads || cylinder >= geometry.cylinders)
+ || get_ata_geometry (&geometry) != 0 || sector == 0u
+ || sector > geometry.sectors_per_track || head >= geometry.heads
+ || cylinder >= geometry.cylinders)
{
int13_fail (regs);
return;
@@ -152,9 +152,9 @@ int13_service (struct bios_regs *regs)
}
lba = (((u32)cylinder * geometry.heads) + head)
- * geometry.sectors_per_track + (u32)sector - 1u;
- buffer_address
- = ((u32)regs->es << 4) + (u16)regs->ebx;
+ * geometry.sectors_per_track
+ + (u32)sector - 1u;
+ buffer_address = ((u32)regs->es << 4) + (u16)regs->ebx;
if (ata_read_sectors28 (lba, (u16 *)buffer_address, count) != 0)
{
@@ -188,8 +188,7 @@ int13_service (struct bios_regs *regs)
max_head = (u8)(geometry.heads - 1u);
sectors_per_track = (u8)geometry.sectors_per_track;
regs->eax &= 0xFFFF0000u;
- regs->ecx = (regs->ecx & 0xFFFF0000u)
- | (u32)(sectors_per_track & 0x3Fu)
+ regs->ecx = (regs->ecx & 0xFFFF0000u) | (u32)(sectors_per_track & 0x3Fu)
| ((u32)(max_cylinder & 0x00FFu) << 8)
| ((u32)(max_cylinder >> 8) << 14);
regs->edx = (regs->edx & 0xFFFF0000u) | ((u32)max_head << 8) | 1u;