From 8e41e4f560ff9840ae19d9c4a403012ff51ca43e Mon Sep 17 00:00:00 2001 From: Zihao Yu Date: Sun, 10 Feb 2019 14:08:49 +0800 Subject: [PATCH] device,vga: add sync reg to update screen from software --- src/device/device.c | 12 ------------ src/device/vga.c | 16 ++++++++++++---- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/src/device/device.c b/src/device/device.c index 864e39d4..4003afc2 100644 --- a/src/device/device.c +++ b/src/device/device.c @@ -9,10 +9,8 @@ #define TIMER_HZ 100 #define VGA_HZ 50 -static uint64_t jiffy = 0; static struct itimerval it; static int device_update_flag = false; -static int update_screen_flag = false; void init_serial(); void init_timer(); @@ -21,17 +19,12 @@ void init_i8042(); extern void timer_intr(); extern void send_key(uint8_t, bool); -extern void update_screen(); static void timer_sig_handler(int signum) { - jiffy ++; timer_intr(); device_update_flag = true; - if (jiffy % (TIMER_HZ / VGA_HZ) == 0) { - update_screen_flag = true; - } int ret = setitimer(ITIMER_VIRTUAL, &it, NULL); Assert(ret == 0, "Can not set timer"); @@ -43,11 +36,6 @@ void device_update() { } device_update_flag = false; - if (update_screen_flag) { - update_screen(); - update_screen_flag = false; - } - SDL_Event event; while (SDL_PollEvent(&event)) { switch (event.type) { diff --git a/src/device/vga.c b/src/device/vga.c index 3c02064e..d04630ce 100644 --- a/src/device/vga.c +++ b/src/device/vga.c @@ -9,6 +9,8 @@ #define SCREEN_PORT 0x100 // Note that this is not the standard #define SCREEN_MMIO 0x4100 +#define SYNC_PORT 0x104 // Note that this is not the standard +#define SYNC_MMIO 0x4104 #define SCREEN_H 300 #define SCREEN_W 400 @@ -26,6 +28,12 @@ void update_screen() { SDL_RenderPresent(renderer); } +static void vga_io_handler(uint32_t offset, int len, bool is_write) { + if (offset == 4 && len == 4 && is_write) { + update_screen(); + } +} + void init_vga() { SDL_Init(SDL_INIT_VIDEO); SDL_CreateWindowAndRenderer(SCREEN_W * 2, SCREEN_H * 2, 0, &window, &renderer); @@ -33,10 +41,10 @@ void init_vga() { texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STATIC, SCREEN_W, SCREEN_H); - screensize_port_base = (void *)new_space(4); - *screensize_port_base = ((SCREEN_W) << 16) | (SCREEN_H); - add_pio_map("screen", SCREEN_PORT, (void *)screensize_port_base, 4, NULL); - add_mmio_map("screen", SCREEN_MMIO, (void *)screensize_port_base, 4, NULL); + screensize_port_base = (void *)new_space(8); + screensize_port_base[0] = ((SCREEN_W) << 16) | (SCREEN_H); + add_pio_map("screen", SCREEN_PORT, (void *)screensize_port_base, 8, vga_io_handler); + add_mmio_map("screen", SCREEN_MMIO, (void *)screensize_port_base, 8, vga_io_handler); vmem = (void *)new_space(0x80000); add_mmio_map("vmem", VMEM, (void *)vmem, 0x80000, NULL); -- GitLab