#include "../syscall.h" #include "../drivers/vga.h" #include enum { FRAME_SIZE = VGA_GRAPHICS_WIDTH * VGA_GRAPHICS_HEIGHT, BLOCK_WIDTH = 270, BLOCK_HEIGHT = 100, BLOCK_X = 10, BLOCK_Y = 0, }; // Non-zero initializer keeps the framebuffer in the program image, which this // loader maps more reliably than a large BSS object. static uint8_t frame[FRAME_SIZE] = { 1 }; static uint32_t time_ms(void) { return (uint32_t)syscall(SYS_time_ms, 0); } static void clear_frame(uint8_t color) { for (uint32_t i = 0; i < FRAME_SIZE; i++) { frame[i] = color; } } static void put_pixel(int x, int y, uint8_t color) { if (x < 0 || x >= VGA_GRAPHICS_WIDTH || y < 0 || y >= VGA_GRAPHICS_HEIGHT) { return; } frame[y * VGA_GRAPHICS_WIDTH + x] = color; } static void draw_demo(void) { clear_frame(0x01); for (int y = 0; y < BLOCK_HEIGHT; y++) { for (int x = 0; x < BLOCK_WIDTH; x++) { int screen_x = BLOCK_X + x; int screen_y = BLOCK_Y + y; uint8_t color = (uint8_t)((x + 2 * y) & 0x3f); if (x < 3 || y < 3 || x >= BLOCK_WIDTH - 3 || y >= BLOCK_HEIGHT - 3) { color = 0x3f; } put_pixel(screen_x, screen_y, color); } } } int main(void) { syscall(SYS_switch_to_graphics, 0); draw_demo(); syscall(SYS_swap_frame, (uintptr_t)frame); uint32_t start = time_ms(); while ((uint32_t)(time_ms() - start) < 2000) { } return 0; }