diff options
Diffstat (limited to 'mubios/services')
| -rw-r--r-- | mubios/services/int10.c | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/mubios/services/int10.c b/mubios/services/int10.c new file mode 100644 index 0000000..76a1c1d --- /dev/null +++ b/mubios/services/int10.c @@ -0,0 +1,88 @@ +/* + RCC-Project + + Copyright (C) 2026 Richard Qin + + This file is part of RCC-Project. + + RCC-Project 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; either version 3 of the License, or (at your option) any + later version. + + RCC-Project is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + RCC-Project; see the file COPYING. If not see + <http://www.gnu.org/licenses/>. + */ + +#include "bios.h" +#include "regs.h" + +#define VGA_TEXT_BASE 0x000B8000u +#define BDA_CURSOR 0x00000450u + +static void +int10_newline (volatile u16 *cursor) +{ + u16 row; + + row = (u16)(*cursor / 80u); + *cursor = (u16)((row + 1u) * 80u); +} + +void +int10_service (struct bios_regs *regs) +{ + volatile u16 *cursor; + volatile u16 *video; + u8 function; + u8 character; + u8 attribute; + u16 position; + + function = (u8)(regs->ax >> 8); + + if (function != 0x0Eu) + return; + + cursor = (volatile u16 *)BDA_CURSOR; + video = (volatile u16 *)VGA_TEXT_BASE; + + character = (u8)regs->ax; + attribute = (u8)regs->bx; + position = *cursor; + + if (character == 0x0Du) + { + *cursor = (u16)((position / 80u) * 80u); + return; + } + + if (character == 0x0Au) + { + int10_newline (cursor); + return; + } + + if (character == 0x08u) + { + if (position != 0u) + { + position--; + video[position] = (u16)(0x20u | ((u16)attribute << 8)); + *cursor = position; + } + + return; + } + + if (position >= 2000u) + position = 0; + + video[position] = (u16)character | ((u16)attribute << 8); + *cursor = (u16)(position + 1u); +} |
