提交 8e41e4f5 编写于 作者: Z Zihao Yu

device,vga: add sync reg to update screen from software

上级 f29d3f23
......@@ -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) {
......
......@@ -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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册