Skip to content
Snippets Groups Projects
Commit e8606f28 authored by adrian.spycher's avatar adrian.spycher
Browse files

feat!: add sprite state machine

parent aa5f387e
No related branches found
No related tags found
No related merge requests found
......@@ -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;
}
......@@ -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) ? &param_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) ? &param_sprite_pos : (hyper_sprite_position_params_t *)addr;
......
......@@ -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_
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment