Mon, 27 Mar 2023 21:36:35 +0200
8 files changed,
56 insertions(+),
10 deletions(-)
A
include/cedos/drivers/graphics.h
@@ -0,0 +1,6 @@
+#ifndef GRAPHICS_H +#define GRAPHICS_H + +int graphics_set_mode(int mode); + +#endif
M
src/apps/common/cedos.c
→
src/apps/common/cedos.c
@@ -53,4 +53,9 @@ int sc_file_open(char *pathname, int flags) {
volatile uint32_t res = 0; interrupt(0x30, res, 6, pathname, flags, 0); return res; +} + +void graphics_set_mode(int mode) { + volatile uint32_t res = 0; + interrupt(0x30, res, 7, mode, 0, 0); }
M
src/apps/common/cedos.h
→
src/apps/common/cedos.h
@@ -11,6 +11,8 @@ int get_pid();
int process_spawn(const char *fname, const char *args); void process_wait(int pid); +void graphics_set_mode(int mode); + int sc_file_read(int fd, char *buffer, uint32_t size); int sc_file_write(int fd, char *buffer, uint32_t size); int sc_file_openat(int fd, char *buffer, uint32_t size);
A
src/apps/gmode.c
@@ -0,0 +1,29 @@
+#include "common/cedos.h" +#include "common/stdio.h" + +#include <stdint.h> + +void main(char *args) { + int mode = 0; + int i = 0; + + while (args[i] != 0) { + char c = args[i]; + if (c >= 'a' && c <= 'f') { + c -= 'a'; + } else if (c >= 'A' && c <= 'F') { + c -= 'A'; + } else if (c >= '0' && c <= '9') { + c -= '0'; + } else { + printf("Character not recognized: %c\n", c); + } + + mode <<= 4; + mode += (int)(c); + i++; + } + + printf("Setting graphics mode %x...\n", mode); + graphics_set_mode(mode); +}
A
src/kernel/drivers/graphics.c
@@ -0,0 +1,9 @@
+#include "cedos/drivers/graphics.h" + +#include <stdint.h> + +extern void realmode_int10h(uint32_t eax, uint32_t ebx, uint32_t ecx); + +int graphics_set_mode(int mode) { + realmode_int10h((uint32_t)(mode), 0, 0); +}
M
src/kernel/graphics.s
→
src/kernel/drivers/graphics.s
@@ -5,6 +5,7 @@ realmode_int10h:
push %ebp mov %esp, %ebp + pushf cli pusha@@ -120,8 +121,7 @@ pop %eax
mov %eax, %esp popa - - sti + popf # return pop %ebp
M
src/kernel/main.c
→
src/kernel/main.c
@@ -26,7 +26,6 @@ #else
#define PRINT_DBG(...) {} #endif -extern void realmode_int10h(uint32_t eax, uint32_t ebx, uint32_t ecx); int os_init(void) { core_init();@@ -67,12 +66,6 @@
printk("Initializing root file system..."); FAT_init(); printk("done."); - - while (1) { - graph[i++] = (i & 0x0F); - - if (i > 320 * 240) { i = 0; } - } printk("Initialization finished.\n--------------\n");
M
src/kernel/syscall.c
→
src/kernel/syscall.c
@@ -2,6 +2,7 @@ #include "cedos/interrupts.h"
#include "cedos/core.h" #include "cedos/sched/sched.h" #include "cedos/file.h" +#include "cedos/drivers/graphics.h" void test(uint32_t ebx, uint32_t ecx, uint32_t edx) { printk("SYSCALL 0x01: EBX=%i ECX=%X EDX=%X\n", ebx, ecx, edx);@@ -18,7 +19,8 @@ sched_yield,
get_current_process, sched_spawn, sched_wait, - file_open + file_open, + graphics_set_mode }; extern void syscall_interrupt(void);