diff --git a/guest/sprite/sprite_phys.c b/guest/sprite/sprite_phys.c index 16c2ab0e1939e65cb06da6a5a7fb63e7a6855002..dea1b2da23ea4ce2a163391715a68c8b132301d9 100644 --- a/guest/sprite/sprite_phys.c +++ b/guest/sprite/sprite_phys.c @@ -9,17 +9,42 @@ // --- FUNCTION --- -// void gfx_phys_init(uint32_t width, uint32_t height) { -// -// while (*(uint32_t *)REG_GFX_INIT_ST == 42); -// -// *(uint32_t *)REG_GFX_INIT_CMD = 5; -// *(uint32_t *)REG_GFX_INIT_DATA = width; -// *(uint32_t *)REG_GFX_INIT_DATA = height; -// } +void sprite_phys_init(uint8_t id, uint8_t *data, uint32_t width, uint32_t height) { -void sprite_phys_init(uint8_t id, uint8_t *data, uint32_t width, uint32_t height) { } + *(uint32_t *)REG_SPRITE_CMD = 9; -void sprite_phys_visibility(uint8_t id, uint8_t toggle) { } + *(uint32_t *)REG_SPRITE_CMD = 27; + *(uint32_t *)REG_SPRITE_DATA = id; -void sprite_phys_position(uint8_t id, uint32_t x, uint32_t y) { } + *(uint32_t *)REG_SPRITE_DATA = width; + *(uint32_t *)REG_SPRITE_DATA = height; + + for (uint32_t i = 0; i < width * height; i++) { + + *(uint8_t *)REG_SPRITE_DATA = *data++; // r + *(uint8_t *)REG_SPRITE_DATA = *data++; // g + *(uint8_t *)REG_SPRITE_DATA = *data++; // b + *(uint8_t *)REG_SPRITE_DATA = *data++; // a + } +} + +void sprite_phys_visibility(uint8_t id, uint8_t toggle) { + + *(uint32_t *)REG_SPRITE_CMD = 14; + + *(uint32_t *)REG_SPRITE_CMD = 27; + *(uint32_t *)REG_SPRITE_DATA = id; + + *(uint8_t *)REG_SPRITE_DATA = toggle; +} + +void sprite_phys_position(uint8_t id, uint32_t x, uint32_t y) { + + *(uint32_t *)REG_SPRITE_CMD = 35; + + *(uint32_t *)REG_SPRITE_CMD = 27; + *(uint32_t *)REG_SPRITE_DATA = id; + + *(uint32_t *)REG_SPRITE_DATA = x; + *(uint32_t *)REG_SPRITE_DATA = y; +} diff --git a/vmm/operation.c b/vmm/operation.c index e0c8211a9807be167245bcb86d7eacc5447b35f2..69d70cb7e4aeea8e9710df4565fb6df626bc852a 100644 --- a/vmm/operation.c +++ b/vmm/operation.c @@ -6,6 +6,7 @@ #include <stdlib.h> #include <stdint.h> #include <stdbool.h> +#include <string.h> #include <unistd.h> #include <semaphore.h> @@ -14,6 +15,10 @@ // --- DEFINE --- +#define UNUSED(x) (void)(x) + +#define BUF_SIZE (1920 * 1080 * 4) + state_t STATE_TIMER[] = { { OP_WRITE_EQUAL, REG_TIMER_CMD, 20, 2, NULL }, @@ -59,8 +64,8 @@ state_t STATE_SPRITE_VIS[] = { { OP_WRITE_EQUAL, REG_SPRITE_CMD, 0xE, 4, NULL }, { OP_WRITE_EQUAL, REG_SPRITE_CMD, 0x1B, 4, NULL }, - { OP_WRITE_STORE, REG_SPRITE_DATA, 0, 4, NULL }, // id - { OP_WRITE_STORE, REG_SPRITE_DATA, 0, 4, NULL }, // toggle + { OP_WRITE_STORE, REG_SPRITE_DATA, 0, 4, op_callback_sprite_visibility_store_id }, + { OP_WRITE_STORE, REG_SPRITE_DATA, 0, 4, op_callback_sprite_visibility_store_toggle }, { OP_EMUL_END, 0, 0, 0, NULL }, }; @@ -68,9 +73,9 @@ state_t STATE_SPRITE_POS[] = { { OP_WRITE_EQUAL, REG_SPRITE_CMD, 0x23, 4, NULL }, { OP_WRITE_EQUAL, REG_SPRITE_CMD, 0x1B, 4, NULL }, - { OP_WRITE_STORE, REG_SPRITE_DATA, 0, 4, NULL }, // id - { OP_WRITE_STORE, REG_SPRITE_DATA, 0, 4, NULL }, // x - { OP_WRITE_STORE, REG_SPRITE_DATA, 0, 4, NULL }, // y + { OP_WRITE_STORE, REG_SPRITE_DATA, 0, 4, op_callback_sprite_position_store_id }, + { OP_WRITE_STORE, REG_SPRITE_DATA, 0, 4, op_callback_sprite_position_store_x }, + { OP_WRITE_STORE, REG_SPRITE_DATA, 0, 4, op_callback_sprite_position_store_y }, { OP_EMUL_END, 0, 0, 0, NULL }, }; @@ -102,8 +107,10 @@ static hyper_sprite_visibility_params_t param_sprite_vis; static hyper_sprite_position_params_t param_sprite_pos; // store the index of the actual loop -static uint32_t loop_ide_data = MAX_LOOP_IDE_DATA; -static uint16_t buf_ide_data[MAX_LOOP_IDE_DATA]; +static uint64_t loop_idx = BUF_SIZE; +static uint8_t loop_buf_8[BUF_SIZE]; +static uint16_t *loop_buf_16 = (uint16_t *)loop_buf_8; +static uint32_t *loop_buf_32 = (uint32_t *)loop_buf_8; // --- STATIC FUNCTION --- @@ -155,11 +162,13 @@ void op_callback_gfx_init_conclude(void *addr) { } void op_callback_ide_prepare(void *addr) { + UNUSED(addr); flag_stop_loop = false; - loop_ide_data = MAX_LOOP_IDE_DATA; + loop_idx = 0; - param_ide.data = (uint64_t)buf_ide_data; + memset(loop_buf_8, 0, sizeof(loop_buf_8)); + param_ide.data = (uint64_t)loop_buf_8; } void op_callback_ide_store_sector_1(void *addr) { @@ -185,13 +194,13 @@ void op_callback_ide_store_sector_4(void *addr) { void op_callback_ide_store_data(void *addr) { - buf_ide_data[MAX_LOOP_IDE_DATA - loop_ide_data] = *(uint16_t *)addr; - loop_ide_data--; + loop_buf_16[loop_idx] = *(uint16_t *)addr; + loop_idx++; - if (loop_ide_data == 0) { + if (loop_idx == MAX_LOOP_IDE_DATA) { + loop_idx = 0; flag_stop_loop = true; - loop_ide_data = MAX_LOOP_IDE_DATA; } } @@ -225,15 +234,42 @@ void op_callback_ide_conclude(void *addr) { fclose(disk); } -void op_callback_sprite_init_prepare(void *addr) { } +void op_callback_sprite_init_prepare(void *addr) { + UNUSED(addr); -void op_callback_sprite_init_store_id(void *addr) { } + flag_stop_loop = false; + loop_idx = 0; + + memset(loop_buf_8, 0, sizeof(loop_buf_8)); + param_sprite_init.data = (uint64_t)loop_buf_8; +} -void op_callback_sprite_init_store_width(void *addr) { } +void op_callback_sprite_init_store_id(void *addr) { -void op_callback_sprite_init_store_height(void *addr) { } + param_sprite_init.id = *(uint32_t *)addr; +} + +void op_callback_sprite_init_store_width(void *addr) { + + param_sprite_init.width = *(uint32_t *)addr; +} -void op_callback_sprite_init_store_pixels(void *addr) { } +void op_callback_sprite_init_store_height(void *addr) { + + param_sprite_init.height = *(uint32_t *)addr; +} + +void op_callback_sprite_init_store_pixels(void *addr) { + + loop_buf_8[loop_idx] = *(uint8_t *)addr; + loop_idx++; + + if (loop_idx == param_sprite_init.width * param_sprite_init.height * 4) { + + loop_idx = 0; + flag_stop_loop = true; + } +} void op_callback_sprite_init_conclude(void *addr) { @@ -245,6 +281,16 @@ void op_callback_sprite_init_conclude(void *addr) { sprites[p_sp_init->id].data = (uint8_t *)p_sp_init->data; } +void op_callback_sprite_visibility_store_id(void *addr) { + + param_sprite_vis.id = *(uint32_t *)addr; +} + +void op_callback_sprite_visibility_store_toggle(void *addr) { + + param_sprite_vis.toggle = *(uint8_t *)addr; +} + void op_callback_sprite_visibility_conclude(void *addr) { hyper_sprite_visibility_params_t *p_sp_vis = (addr == NULL) ? ¶m_sprite_vis : (hyper_sprite_visibility_params_t *)addr; @@ -253,6 +299,21 @@ void op_callback_sprite_visibility_conclude(void *addr) { sprites[p_sp_vis->id].toggle = p_sp_vis->toggle; } +void op_callback_sprite_position_store_id(void *addr) { + + param_sprite_pos.id = *(uint32_t *)addr; +} + +void op_callback_sprite_position_store_x(void *addr) { + + param_sprite_pos.x = *(uint32_t *)addr; +} + +void op_callback_sprite_position_store_y(void *addr) { + + param_sprite_pos.y = *(uint32_t *)addr; +} + void op_callback_sprite_position_conclude(void *addr) { hyper_sprite_position_params_t *p_sp_pos = (addr == NULL) ? ¶m_sprite_pos : (hyper_sprite_position_params_t *)addr; diff --git a/vmm/operation.h b/vmm/operation.h index 8fe601008f23c2300309ae3da96a7226e84d1f30..efb924a2beaf404acfa43f0a477304f1baec4f76 100644 --- a/vmm/operation.h +++ b/vmm/operation.h @@ -136,8 +136,18 @@ void op_callback_sprite_init_store_pixels(void *addr); void op_callback_sprite_init_conclude(void *addr); +void op_callback_sprite_visibility_store_id(void *addr); + +void op_callback_sprite_visibility_store_toggle(void *addr); + void op_callback_sprite_visibility_conclude(void *addr); +void op_callback_sprite_position_store_id(void *addr); + +void op_callback_sprite_position_store_x(void *addr); + +void op_callback_sprite_position_store_y(void *addr); + void op_callback_sprite_position_conclude(void *addr); #endif // _OPERATION_H_