summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--genesis.c3
-rw-r--r--sms.c3
-rw-r--r--stateview.c17
-rw-r--r--vdp.c16
-rw-r--r--vdp.h138
5 files changed, 83 insertions, 94 deletions
diff --git a/genesis.c b/genesis.c
index b0ff852..70664ce 100644
--- a/genesis.c
+++ b/genesis.c
@@ -1302,8 +1302,7 @@ genesis_context *alloc_init_genesis(rom_info *rom, void *main_rom, void *lock_on
gen->header.info = *rom;
set_region(gen, rom, force_region);
- gen->vdp = malloc(sizeof(vdp_context));
- init_vdp_context(gen->vdp, gen->version_reg & 0x40);
+ gen->vdp = init_vdp_context(gen->version_reg & 0x40);
gen->vdp->system = &gen->header;
gen->frame_end = vdp_cycles_to_frame_end(gen->vdp);
char * config_cycles = tern_find_path(config, "clocks\0max_cycles\0", TVAL_PTR).ptrval;
diff --git a/sms.c b/sms.c
index e413964..2751c72 100644
--- a/sms.c
+++ b/sms.c
@@ -581,8 +581,7 @@ sms_context *alloc_configure_sms(system_media *media, uint32_t opts, uint8_t for
sms->psg = malloc(sizeof(psg_context));
psg_init(sms->psg, sms->master_clock, 15*16);
- sms->vdp = malloc(sizeof(vdp_context));
- init_vdp_context(sms->vdp, 0);
+ sms->vdp = init_vdp_context(0);
sms->vdp->system = &sms->header;
sms->header.info.save_type = SAVE_NONE;
diff --git a/stateview.c b/stateview.c
index b44c0b2..fe7ac54 100644
--- a/stateview.c
+++ b/stateview.c
@@ -116,17 +116,16 @@ int main(int argc, char ** argv)
width = width < 320 ? def_width : width;
height = height < 240 ? (width/320) * 240 : height;
- vdp_context context;
render_init(width, height, "GST State Viewer", 0);
- init_vdp_context(&context, 0);
- vdp_load_gst(&context, state_file);
- vdp_run_to_vblank(&context);
- vdp_print_sprite_table(&context);
- printf("Display %s\n", (context.regs[REG_MODE_2] & DISPLAY_ENABLE) ? "enabled" : "disabled");
- if (!(context.regs[REG_MODE_2] & DISPLAY_ENABLE)) {
+ vdp_context *context = init_vdp_context(0);
+ vdp_load_gst(context, state_file);
+ vdp_run_to_vblank(context);
+ vdp_print_sprite_table(context);
+ printf("Display %s\n", (context->regs[REG_MODE_2] & DISPLAY_ENABLE) ? "enabled" : "disabled");
+ if (!(context->regs[REG_MODE_2] & DISPLAY_ENABLE)) {
puts("Forcing display on");
- vdp_control_port_write(&context, 0x8000 | REG_MODE_2 << 8 | context.regs[REG_MODE_2] | DISPLAY_ENABLE);
+ vdp_control_port_write(context, 0x8000 | REG_MODE_2 << 8 | context->regs[REG_MODE_2] | DISPLAY_ENABLE);
}
- render_wait_quit(&context);
+ render_wait_quit(context);
return 0;
}
diff --git a/vdp.c b/vdp.c
index b744bf5..c52ac51 100644
--- a/vdp.c
+++ b/vdp.c
@@ -19,7 +19,6 @@
#define MAP_BIT_H_FLIP 0x800
#define MAP_BIT_V_FLIP 0x1000
-#define SCROLL_BUFFER_SIZE 32
#define SCROLL_BUFFER_MASK (SCROLL_BUFFER_SIZE-1)
#define SCROLL_BUFFER_DRAW (SCROLL_BUFFER_SIZE/2)
@@ -138,13 +137,9 @@ static void update_video_params(vdp_context *context)
static uint8_t color_map_init_done;
-void init_vdp_context(vdp_context * context, uint8_t region_pal)
+vdp_context *init_vdp_context(uint8_t region_pal)
{
- memset(context, 0, sizeof(*context));
- context->vdpmem = malloc(VRAM_SIZE);
- memset(context->vdpmem, 0, VRAM_SIZE);
- /*
- */
+ vdp_context *context = calloc(1, sizeof(vdp_context) + VRAM_SIZE);
if (headless) {
context->output = malloc(LINEBUF_SIZE * sizeof(uint32_t));
context->output_pitch = 0;
@@ -152,10 +147,6 @@ void init_vdp_context(vdp_context * context, uint8_t region_pal)
context->cur_buffer = FRAMEBUFFER_ODD;
context->fb = render_get_framebuffer(FRAMEBUFFER_ODD, &context->output_pitch);
}
- context->linebuf = malloc(LINEBUF_SIZE + SCROLL_BUFFER_SIZE*2);
- memset(context->linebuf, 0, LINEBUF_SIZE + SCROLL_BUFFER_SIZE*2);
- context->tmp_buf_a = context->linebuf + LINEBUF_SIZE;
- context->tmp_buf_b = context->tmp_buf_a + SCROLL_BUFFER_SIZE;
context->sprite_draws = MAX_DRAWS;
context->fifo_write = 0;
context->fifo_read = -1;
@@ -250,12 +241,11 @@ void init_vdp_context(vdp_context * context, uint8_t region_pal)
if (!headless) {
context->output = (uint32_t *)(((char *)context->fb) + context->output_pitch * context->border_top);
}
+ return context;
}
void vdp_free(vdp_context *context)
{
- free(context->vdpmem);
- free(context->linebuf);
free(context);
}
diff --git a/vdp.h b/vdp.h
index 5b17461..d0dc15d 100644
--- a/vdp.h
+++ b/vdp.h
@@ -19,6 +19,7 @@
#define BORDER_RIGHT 14
#define HORIZ_BORDER (BORDER_LEFT+BORDER_RIGHT)
#define LINEBUF_SIZE (320+HORIZ_BORDER) //H40 + full border
+#define SCROLL_BUFFER_SIZE 32
#define BORDER_BOTTOM 13 //TODO: Replace with actual value
#define MAX_DRAWS 40
#define MAX_DRAWS_H32 32
@@ -156,80 +157,81 @@ enum {
};
typedef struct {
- fifo_entry fifo[FIFO_SIZE];
- int32_t fifo_write;
- int32_t fifo_read;
- uint32_t address;
- uint32_t serial_address;
- uint8_t cd;
- uint8_t flags;
- uint8_t regs[VDP_REGS];
+ system_header *system;
+ //pointer to current line in framebuffer
+ uint32_t *output;
+ uint32_t *done_output;
+ //pointer to current framebuffer
+ uint32_t *fb;
+ uint32_t *debug_fbs[VDP_NUM_DEBUG_TYPES];
+ uint32_t output_pitch;
+ uint32_t debug_fb_pitch[VDP_NUM_DEBUG_TYPES];
+ fifo_entry fifo[FIFO_SIZE];
+ int32_t fifo_write;
+ int32_t fifo_read;
+ uint32_t address;
+ uint32_t serial_address;
+ uint32_t colors[CRAM_SIZE*4];
+ uint32_t debugcolors[1 << (3 + 1 + 1 + 1)];//3 bits for source, 1 bit for priority, 1 bit for shadow, 1 bit for hilight
+ uint16_t cram[CRAM_SIZE];
+ uint32_t frame;
+ uint8_t cd;
+ uint8_t flags;
+ uint8_t regs[VDP_REGS];
//cycle count in MCLKs
- uint32_t cycles;
- uint32_t pending_vint_start;
- uint32_t pending_hint_start;
- uint8_t *vdpmem;
+ uint32_t cycles;
+ uint32_t pending_vint_start;
+ uint32_t pending_hint_start;
+ uint16_t vsram[VSRAM_SIZE];
+ uint16_t vscroll_latch[2];
+ uint16_t vcounter;
+ uint16_t inactive_start;
+ uint16_t border_top;
+ uint16_t border_bot;
+ uint16_t hscroll_a;
+ uint16_t hscroll_b;
+ uint16_t h40_lines;
+ uint16_t output_lines;
+ sprite_draw sprite_draw_list[MAX_DRAWS];
+ sprite_info sprite_info_list[MAX_SPRITES_LINE];
+ uint8_t sat_cache[SAT_CACHE_SIZE];
+ uint16_t col_1;
+ uint16_t col_2;
+ uint16_t hv_latch;
+ uint16_t prefetch;
+ uint16_t test_port;
//stores 2-bit palette + 4-bit palette index + priority for current sprite line
- uint8_t *linebuf;
- //pointer to current line in framebuffer
- uint32_t *output;
- uint32_t *done_output;
- uint32_t *fb;
- uint32_t *debug_fbs[VDP_NUM_DEBUG_TYPES];
- uint32_t debug_fb_pitch[VDP_NUM_DEBUG_TYPES];
- system_header *system;
- uint16_t cram[CRAM_SIZE];
- uint32_t colors[CRAM_SIZE*4];
- uint32_t debugcolors[1 << (3 + 1 + 1 + 1)];//3 bits for source, 1 bit for priority, 1 bit for shadow, 1 bit for hilight
- uint16_t vsram[VSRAM_SIZE];
- uint16_t vscroll_latch[2];
- uint32_t output_pitch;
- uint32_t frame;
- uint16_t vcounter;
- uint16_t inactive_start;
- uint16_t border_top;
- uint16_t border_bot;
- uint16_t hscroll_a;
- uint16_t hscroll_b;
- uint16_t h40_lines;
- uint16_t output_lines;
- sprite_draw sprite_draw_list[MAX_DRAWS];
- sprite_info sprite_info_list[MAX_SPRITES_LINE];
- uint8_t sat_cache[SAT_CACHE_SIZE];
- uint16_t col_1;
- uint16_t col_2;
- uint16_t hv_latch;
- uint16_t prefetch;
- uint16_t test_port;
- uint8_t hslot; //hcounter/2
- uint8_t sprite_index;
- uint8_t sprite_draws;
- int8_t slot_counter;
- int8_t cur_slot;
- uint8_t max_sprites_frame;
- uint8_t max_sprites_line;
- uint8_t fetch_tmp[2];
- uint8_t v_offset;
- uint8_t hint_counter;
- uint8_t flags2;
- uint8_t double_res;
- uint8_t buf_a_off;
- uint8_t buf_b_off;
- uint8_t debug;
- uint8_t debug_pal;
- uint8_t pending_byte;
- uint8_t state;
- uint8_t cur_buffer;
- uint8_t *tmp_buf_a;
- uint8_t *tmp_buf_b;
- uint8_t enabled_debuggers;
- uint8_t debug_fb_indices[VDP_NUM_DEBUG_TYPES];
- uint8_t debug_modes[VDP_NUM_DEBUG_TYPES];
+ uint8_t linebuf[LINEBUF_SIZE];
+ uint8_t hslot; //hcounter/2
+ uint8_t sprite_index;
+ uint8_t sprite_draws;
+ int8_t slot_counter;
+ int8_t cur_slot;
+ uint8_t max_sprites_frame;
+ uint8_t max_sprites_line;
+ uint8_t fetch_tmp[2];
+ uint8_t v_offset;
+ uint8_t hint_counter;
+ uint8_t flags2;
+ uint8_t double_res;
+ uint8_t buf_a_off;
+ uint8_t buf_b_off;
+ uint8_t debug;
+ uint8_t debug_pal;
+ uint8_t pending_byte;
+ uint8_t state;
+ uint8_t cur_buffer;
+ uint8_t tmp_buf_a[SCROLL_BUFFER_SIZE];
+ uint8_t tmp_buf_b[SCROLL_BUFFER_SIZE];
+ uint8_t enabled_debuggers;
+ uint8_t debug_fb_indices[VDP_NUM_DEBUG_TYPES];
+ uint8_t debug_modes[VDP_NUM_DEBUG_TYPES];
+ uint8_t vdpmem[];
} vdp_context;
-void init_vdp_context(vdp_context * context, uint8_t region_pal);
+vdp_context *init_vdp_context(uint8_t region_pal);
void vdp_free(vdp_context *context);
void vdp_run_context_full(vdp_context * context, uint32_t target_cycles);
void vdp_run_context(vdp_context * context, uint32_t target_cycles);