# HG changeset patch # User Michael Pavone # Date 1542426984 28800 # Node ID 3602f3b2007212b7f370417a965e68abd89bd352 # Parent 93518786f8824f6bd26802288ca190b4633ce72d Small cleanup of vdp_context struct layout and removal of separately allocated buffers diff -r 93518786f882 -r 3602f3b20072 genesis.c --- a/genesis.c Thu Nov 15 22:21:09 2018 -0800 +++ b/genesis.c Fri Nov 16 19:56:24 2018 -0800 @@ -1302,8 +1302,7 @@ 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 -r 93518786f882 -r 3602f3b20072 sms.c --- a/sms.c Thu Nov 15 22:21:09 2018 -0800 +++ b/sms.c Fri Nov 16 19:56:24 2018 -0800 @@ -581,8 +581,7 @@ 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 -r 93518786f882 -r 3602f3b20072 stateview.c --- a/stateview.c Thu Nov 15 22:21:09 2018 -0800 +++ b/stateview.c Fri Nov 16 19:56:24 2018 -0800 @@ -116,17 +116,16 @@ 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 -r 93518786f882 -r 3602f3b20072 vdp.c --- a/vdp.c Thu Nov 15 22:21:09 2018 -0800 +++ b/vdp.c Fri Nov 16 19:56:24 2018 -0800 @@ -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 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 @@ 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 @@ 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 -r 93518786f882 -r 3602f3b20072 vdp.h --- a/vdp.h Thu Nov 15 22:21:09 2018 -0800 +++ b/vdp.h Fri Nov 16 19:56:24 2018 -0800 @@ -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 @@ }; 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]; - //cycle count in MCLKs - uint32_t cycles; - uint32_t pending_vint_start; - uint32_t pending_hint_start; - uint8_t *vdpmem; - //stores 2-bit palette + 4-bit palette index + priority for current sprite line - uint8_t *linebuf; + system_header *system; //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]; + 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; + 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[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);