diff options
| author | Richard Qin <richard.qin.x@gmail.com> | 2026-11-10 02:29:20 +0800 |
|---|---|---|
| committer | Richard Qin <richard.qin.x@gmail.com> | 2026-11-10 02:29:20 +0800 |
| commit | 7ecf4901b486693e525d3daafc7d6e9c3a4abcd0 (patch) | |
| tree | 722ed5d7919170cedef44bdb22bc87ab98a47682 /mubios/include | |
| parent | 03c2c766aad0746ca3e71b44756b443ae8742e95 (diff) | |
| download | rcc-project-7ecf4901b486693e525d3daafc7d6e9c3a4abcd0.tar.gz rcc-project-7ecf4901b486693e525d3daafc7d6e9c3a4abcd0.tar.xz | |
[mubios] Complete VGA text initialization and add VBE graphics services
Load the 8x16 font and VGA palette, restore text memory mapping, and synchronize BIOS cursor and page state with the hardware.
Allocate QEMU standard VGA PCI memory resources and expose VBE controller information, mode queries and switching, logical scanline lengths, and display start control.
Signed-off-by: Richard Qin <richard.qin.x@gmail.com>
Diffstat (limited to 'mubios/include')
| -rw-r--r-- | mubios/include/io.h | 21 | ||||
| -rw-r--r-- | mubios/include/vbe.h | 75 | ||||
| -rw-r--r-- | mubios/include/vga.h | 60 |
3 files changed, 156 insertions, 0 deletions
diff --git a/mubios/include/io.h b/mubios/include/io.h index cedd1c1..a056c13 100644 --- a/mubios/include/io.h +++ b/mubios/include/io.h @@ -50,4 +50,25 @@ io_in16 (u16 port) return value; } +static inline void +io_out16 (u16 port, u16 value) +{ + __asm__ volatile ("outw %0, %1" : : "a"(value), "Nd"(port)); +} + +static inline u32 +io_in32 (u16 port) +{ + u32 value; + + __asm__ volatile ("inl %1, %0" : "=a"(value) : "Nd"(port)); + return value; +} + +static inline void +io_out32 (u16 port, u32 value) +{ + __asm__ volatile ("outl %0, %1" : : "a"(value), "Nd"(port)); +} + #endif // MUBIOS_IO_H diff --git a/mubios/include/vbe.h b/mubios/include/vbe.h new file mode 100644 index 0000000..eea2bd2 --- /dev/null +++ b/mubios/include/vbe.h @@ -0,0 +1,75 @@ +/* + 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/>. + */ + +#ifndef MUBIOS_VBE_H +#define MUBIOS_VBE_H + +#include "bios.h" + +#define VBE_MODE_COUNT 15u +#define VBE_MODE_LINEAR 0x4000u +#define VBE_MODE_PRESERVE 0x8000u +#define VBE_OK 0x004Fu +#define VBE_FAILED 0x014Fu +#define VBE_UNSUPPORTED 0x024Fu + +#define DISPI_XRES 1u +#define DISPI_YRES 2u +#define DISPI_BPP 3u +#define DISPI_ENABLE 4u +#define DISPI_BANK 5u +#define DISPI_VIRT_WIDTH 6u +#define DISPI_VIRT_HEIGHT 7u +#define DISPI_X_OFFSET 8u +#define DISPI_Y_OFFSET 9u + +struct vbe_mode +{ + u16 number; + u16 width; + u16 height; + u16 bpp; +}; + +struct vbe_state +{ + u32 framebuffer; + u32 memory_size; + u16 max_width; + u16 max_height; + u16 max_bpp; + u16 current_mode; + u16 mode_list[VBE_MODE_COUNT + 1u]; + u8 present; +}; + +extern struct vbe_state vbe; + +void vbe_init (void); +void vbe_leave_graphics (void); +u16 vbe_read (u16 index); +void vbe_write (u16 index, u16 value); +const struct vbe_mode *vbe_find_mode (u16 number); +u16 vbe_set_mode (u16 request); +u16 vbe_get_mode (u16 *number); +void vbe_service (struct bios_regs *regs); + +#endif diff --git a/mubios/include/vga.h b/mubios/include/vga.h new file mode 100644 index 0000000..5b69671 --- /dev/null +++ b/mubios/include/vga.h @@ -0,0 +1,60 @@ +/* + 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/>. + */ + +#ifndef MUBIOS_VGA_H +#define MUBIOS_VGA_H + +#include "bios.h" + +#define VGA_TEXT_BASE 0x000B8000u +#define VGA_COLUMNS 80u +#define VGA_ROWS 25u +#define VGA_TEXT_CELLS (VGA_COLUMNS * VGA_ROWS) +#define VGA_PAGE_SIZE 0x1000u +#define VGA_PAGE_COUNT 8u +#define VGA_FONT_HEIGHT 16u + +/* All BDA constants below are offsets relative to MUBIOS_BDA_BASE. */ +#define BDA_VIDEO_MODE 0x49u +#define BDA_VIDEO_COLUMNS 0x4Au +#define BDA_VIDEO_PAGE_SIZE 0x4Cu +#define BDA_VIDEO_PAGE_START 0x4Eu +#define BDA_CURSOR_BASE 0x50u +#define BDA_CURSOR_SHAPE 0x60u +#define BDA_VIDEO_PAGE 0x62u +#define BDA_VIDEO_CRTC 0x63u +#define BDA_VIDEO_MSR 0x65u +#define BDA_VIDEO_PALETTE 0x66u +#define BDA_VIDEO_ROWS 0x84u +#define BDA_VIDEO_HEIGHT 0x85u +#define BDA_VIDEO_CTL 0x87u +#define BDA_VIDEO_SWITCHES 0x88u +#define BDA_VIDEO_MODESET_CTL 0x89u +#define BDA_VIDEO_DCC 0x8Au + +extern const u8 vga_font_8x16[256 * VGA_FONT_HEIGHT]; + +void vga_text_mode_set (u8 preserve); +void vga_set_cursor_shape (u16 shape); +void vga_set_cursor_position (u8 page, u16 position); +void vga_set_active_page (u8 page); + +#endif |
