1
0
Fork 0
undar-lang-old/src/arch/linux/devices.c

99 lines
2.5 KiB
C

#include "devices.h"
int screen_open(void *data, uint32_t mode) {
ScreenDeviceData *screen = (ScreenDeviceData *)data;
screen->window =
SDL_CreateWindow("Reality Engine VM", SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED, screen->width, screen->height,
SDL_WINDOW_SHOWN | SDL_WINDOW_ALLOW_HIGHDPI);
if (!screen->window)
return -1;
screen->renderer = SDL_CreateRenderer(
screen->window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (!screen->renderer)
return -1;
screen->texture = SDL_CreateTexture(
screen->renderer, SDL_PIXELFORMAT_RGB332, SDL_TEXTUREACCESS_STREAMING,
screen->width, screen->height);
if (!screen->texture)
return -1;
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "0");
return 0;
}
int screen_read(void *data, uint8_t *buffer, uint32_t size) { return -1; }
int screen_write(void *data, const uint8_t *buffer, uint32_t size) {
ScreenDeviceData *screen = (ScreenDeviceData *)data;
if (size > screen->framebuffer_size * sizeof(uint8_t)) {
return -1;
}
memcpy(&screen->vm->memory[screen->framebuffer_pos], buffer, size);
return 0;
}
int screen_close(void *data) {
ScreenDeviceData *screen = (ScreenDeviceData *)data;
if (screen->texture) {
SDL_DestroyTexture(screen->texture);
screen->texture = NULL;
}
if (screen->renderer) {
SDL_DestroyRenderer(screen->renderer);
screen->renderer = NULL;
}
if (screen->window) {
SDL_DestroyWindow(screen->window);
screen->window = NULL;
}
return 0;
}
/* MOUSE */
int mouse_open(void *data, uint32_t mode) { return 0; }
int mouse_read(void *data, uint8_t *buffer, uint32_t size) {
MouseDeviceData *mouse = (MouseDeviceData *)data;
if (size < 3 * sizeof(uint32_t))
return -1;
uint32_t *out = (uint32_t *)buffer;
out[0] = mouse->x;
out[1] = mouse->y;
out[2] = (mouse->btn1 | (mouse->btn2 << 1) | (mouse->btn3 << 2) |
(mouse->btn4 << 3));
return 0;
}
int mouse_write(void *data, const uint8_t *buffer, uint32_t size) { return -1; }
int mouse_close(void *data) { return 0; }
int keyboard_open(void *data, uint32_t mode) { return 0; }
int keyboard_read(void *data, uint8_t *buffer, uint32_t size) {
KeyboardDeviceData *kbd = (KeyboardDeviceData *)data;
if (size < (uint32_t)kbd->key_count)
return -1;
memcpy(buffer, kbd->keys, kbd->key_count);
return 0;
}
int keyboard_write(void *data, const uint8_t *buffer, uint32_t size) {
return -1; /* not writable */
}
int keyboard_close(void *data) { return 0; }