# HG changeset patch # User Mike Pavone # Date 1382852327 25200 # Node ID c08a4efeee7fca02eec68334789a7ccdfbac2923 # Parent 7696d824489d42ded9aa8ce9c32d6a91fb45bb3d# Parent db5880d8ea034595ffcfbb16b0746a92c9644f1c Update opengl branch from default. Fix build breakage unrelated to merge diff -r db5880d8ea03 -r c08a4efeee7f Makefile --- a/Makefile Thu Oct 03 21:22:05 2013 -0700 +++ b/Makefile Sat Oct 26 22:38:47 2013 -0700 @@ -1,4 +1,4 @@ -LIBS=sdl +LIBS=sdl gl LDFLAGS=-lm `pkg-config --libs $(LIBS)` ifdef DEBUG CFLAGS=-ggdb -std=gnu99 `pkg-config --cflags-only-I $(LIBS)` -Wreturn-type -Werror=return-type diff -r db5880d8ea03 -r c08a4efeee7f blastem.c --- a/blastem.c Thu Oct 03 21:22:05 2013 -0700 +++ b/blastem.c Sat Oct 26 22:38:47 2013 -0700 @@ -62,7 +62,7 @@ uint8_t block[SMD_BLOCK_SIZE]; filesize -= SMD_HEADER_SIZE; fseek(f, SMD_HEADER_SIZE, SEEK_SET); - + uint16_t * dst = cart; while (filesize > 0) { fread(block, 1, SMD_BLOCK_SIZE, f); @@ -149,15 +149,15 @@ if (next_hint < context->int_cycle) { context->int_cycle = next_hint; context->int_num = 4; - + } } } } context->target_cycle = context->int_cycle < context->sync_cycle ? context->int_cycle : context->sync_cycle; - /*printf("Cyc: %d, Trgt: %d, Int Cyc: %d, Int: %d, Mask: %X, V: %d, H: %d, HICount: %d, HReg: %d, Line: %d\n", - context->current_cycle, context->target_cycle, context->int_cycle, context->int_num, (context->status & 0x7), + /*printf("Cyc: %d, Trgt: %d, Int Cyc: %d, Int: %d, Mask: %X, V: %d, H: %d, HICount: %d, HReg: %d, Line: %d\n", + context->current_cycle, context->target_cycle, context->int_cycle, context->int_num, (context->status & 0x7), v_context->regs[REG_MODE_2] & 0x20, v_context->regs[REG_MODE_1] & 0x10, v_context->hint_counter, v_context->regs[REG_HINT], v_context->cycles / MCLKS_LINE);*/ } @@ -217,7 +217,7 @@ } psg_run(gen->psg, target); ym_run(gen->ym, target); - + //printf("Target: %d, YM bufferpos: %d, PSG bufferpos: %d\n", target, gen->ym->buffer_pos, gen->psg->buffer_pos * 2); } @@ -239,7 +239,7 @@ } //printf("reached frame end | 68K Cycles: %d, MCLK Cycles: %d\n", context->current_cycle, mclks); vdp_run_context(v_context, mclks_per_frame); - + if (!headless) { break_on_sync |= wait_render_frame(v_context, frame_limit); } @@ -278,9 +278,9 @@ adjust_int_cycle(context, v_context); if (address) { if (break_on_sync) { - break_on_sync = 0; - debugger(context, address); - } + break_on_sync = 0; + debugger(context, address); + } if (save_state) { save_state = 0; while (!z_context->pc) @@ -532,7 +532,7 @@ } if (value & 1) { dputs("bus requesting Z80"); - + if(!reset && !busreq) { sync_z80(gen->z80, context->current_cycle * MCLKS_PER_68K + Z80_ACK_DELAY*MCLKS_PER_Z80); busack_cycle = (gen->z80->current_cycle * MCLKS_PER_Z80) / MCLKS_PER_68K;//context->current_cycle + Z80_ACK_DELAY; @@ -556,7 +556,7 @@ } //busack_cycle = CYCLE_NEVER; //busack = Z80_REQ_BUSY; - + } } else if (location == 0x1200) { sync_z80(gen->z80, context->current_cycle * MCLKS_PER_68K); @@ -1471,7 +1471,7 @@ //Z80 debug commands switch(input_buf[1]) { - case 'b': + case 'b': param = find_param(input_buf); if (!param) { fputs("zb command requires a parameter\n", stderr); @@ -1507,7 +1507,7 @@ context->master_clock = ((uint64_t)context->normal_clock * (uint64_t)percent) / 100; while (context->ym->current_cycle != context->psg->cycles) { sync_sound(context, context->psg->cycles + MCLKS_PER_PSG); - } +} ym_adjust_master_clock(context->ym, context->master_clock); psg_adjust_master_clock(context->psg, context->master_clock); } @@ -1523,7 +1523,7 @@ const memmap_chunk static_map[] = { {0, 0x400000, 0xFFFFFF, 0, MMAP_READ, cart, NULL, NULL, NULL, NULL}, - {0xE00000, 0x1000000, 0xFFFF, 0, MMAP_READ | MMAP_WRITE | MMAP_CODE, ram, + {0xE00000, 0x1000000, 0xFFFF, 0, MMAP_READ | MMAP_WRITE | MMAP_CODE, ram, NULL, NULL, NULL, NULL}, {0xC00000, 0xE00000, 0x1FFFFF, 0, 0, NULL, (read_16_fun)vdp_port_read, (write_16_fun)vdp_port_write, @@ -1576,7 +1576,7 @@ memmap[0].mask = 0xFFFFFF; memmap[0].flags = MMAP_READ; memmap[0].buffer = cart; - + ram_start &= 0xFFFFFE; ram_end |= 1; memmap[1].start = ram_start; @@ -1593,7 +1593,7 @@ size /= 2; } memmap[1].buffer = gen->save_ram = malloc(size); - + memcpy(memmap+2, static_map+1, sizeof(static_map)-sizeof(static_map[0])); num_chunks = sizeof(static_map)/sizeof(memmap_chunk)+1; } else { @@ -1602,7 +1602,7 @@ memmap[0].mask = 0xFFFFFF; memmap[0].flags = MMAP_READ; memmap[0].buffer = cart; - + memmap[1].start = 0x200000; memmap[1].end = 0x400000; memmap[1].mask = 0x1FFFFF; @@ -1622,7 +1622,7 @@ memmap[num_chunks].end = 0xA13100; memmap[num_chunks].mask = 0xFF; memmap[num_chunks].write_16 = (write_16_fun)write_bank_reg_w; - memmap[num_chunks].write_8 = (write_8_fun)write_bank_reg_b; + memmap[num_chunks].write_8 = (write_8_fun)write_bank_reg_b; num_chunks++; ram_end++; size = ram_end-ram_start; @@ -1651,7 +1651,7 @@ init_x86_68k_opts(&opts, memmap, num_chunks); opts.address_log = address_log; init_68k_context(&context, opts.native_code_map, &opts); - + context.video_context = gen->vdp; context.system = gen; //cartridge ROM @@ -1885,21 +1885,21 @@ fps = 50; } if (!headless) { - render_init(width, height, title, fps, fullscreen); + render_init(width, height, title, fps, fullscreen, 0); } vdp_context v_context; genesis_context gen; memset(&gen, 0, sizeof(gen)); gen.master_clock = gen.normal_clock = fps == 60 ? MCLKS_NTSC : MCLKS_PAL; - + init_vdp_context(&v_context); - + ym2612_context y_context; ym_init(&y_context, render_sample_rate(), gen.master_clock, MCLKS_PER_YM, render_audio_buffer(), ym_log ? YM_OPT_WAVE_LOG : 0); - + psg_context p_context; psg_init(&p_context, render_sample_rate(), gen.master_clock, MCLKS_PER_PSG, render_audio_buffer()); - + z80_context z_context; x86_z80_options z_opts; init_x86_z80_opts(&z_opts); @@ -1910,13 +1910,13 @@ z_context.sync_cycle = z_context.target_cycle = mclks_per_frame/MCLKS_PER_Z80; z_context.int_cycle = CYCLE_NEVER; z_context.mem_pointers[1] = z_context.mem_pointers[2] = (uint8_t *)cart; - + gen.z80 = &z_context; gen.vdp = &v_context; gen.ym = &y_context; gen.psg = &p_context; genesis = &gen; - + int fname_size = strlen(romfname); sram_filename = malloc(fname_size+6); memcpy(sram_filename, romfname, fname_size); @@ -1931,7 +1931,7 @@ strcpy(sram_filename + fname_size, ".sram"); } set_keybindings(); - + init_run_cpu(&gen, debug, address_log, statefile); return 0; } diff -r db5880d8ea03 -r c08a4efeee7f render.h --- a/render.h Thu Oct 03 21:22:05 2013 -0700 +++ b/render.h Sat Oct 26 22:38:47 2013 -0700 @@ -1,6 +1,6 @@ /* Copyright 2013 Michael Pavone - This file is part of BlastEm. + This file is part of BlastEm. BlastEm is free software distributed under the terms of the GNU General Public License version 3 or greater. See COPYING for full license text. */ #ifndef RENDER_H_ @@ -9,9 +9,17 @@ #include "vdp.h" #include "psg.h" #include "ym2612.h" + +typedef struct { + void *oddbuf; + void *evenbuf; + int stride; +} surface_info; + uint32_t render_map_color(uint8_t r, uint8_t g, uint8_t b); +void render_alloc_surfaces(vdp_context * context); uint8_t render_depth(); -void render_init(int width, int height, char * title, uint32_t fps, uint8_t fullscreen); +void render_init(int width, int height, char * title, uint32_t fps, uint8_t fullscreen, uint8_t use_gl); void render_context(vdp_context * context); void render_wait_quit(vdp_context * context); void render_wait_psg(psg_context * context); diff -r db5880d8ea03 -r c08a4efeee7f render_sdl.c --- a/render_sdl.c Thu Oct 03 21:22:05 2013 -0700 +++ b/render_sdl.c Sat Oct 26 22:38:47 2013 -0700 @@ -1,6 +1,6 @@ /* Copyright 2013 Michael Pavone - This file is part of BlastEm. + This file is part of BlastEm. BlastEm is free software distributed under the terms of the GNU General Public License version 3 or greater. See COPYING for full license text. */ #include @@ -9,9 +9,16 @@ #include "blastem.h" #include "io.h" +#ifndef DISABLE_OPENGL +#define GL_GLEXT_PROTOTYPES +#include +#include +#endif + SDL_Surface *screen; uint8_t render_dbg = 0; uint8_t debug_pal = 0; +uint8_t render_gl; uint32_t last_frame = 0; @@ -85,7 +92,54 @@ uint32_t render_map_color(uint8_t r, uint8_t g, uint8_t b) { - return SDL_MapRGB(screen->format, r, g, b); + if (render_gl) { + return b << 24 | g << 16 | r << 8 | 255; + } else { + return SDL_MapRGB(screen->format, r, g, b); + } +} + +GLuint textures[3], buffers[2]; + +const GLfloat vertex_data[] = { + -1.0f, -1.0f, + 1.0f, -1.0f, + -1.0f, 1.0f, + 1.0f, 1.0f +}; + +const GLushort element_data[] = {0, 1, 2, 3}; + +void render_alloc_surfaces(vdp_context * context) +{ + if (render_gl) { + context->oddbuf = context->framebuf = malloc(320 * 240 * 4 * 2); + memset(context->oddbuf, 0, 320 * 240 * 4 * 2); + context->evenbuf = ((char *)context->oddbuf) + 320 * 240 * 4; + glGenTextures(3, textures); + for (int i = 0; i < 3; i++) + { + glBindTexture(GL_TEXTURE_2D, textures[i]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + if (i < 2) { + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 512, 256, 0, GL_BGRA, GL_UNSIGNED_BYTE, i ? context->evenbuf : context->oddbuf); + } else { + uint32_t blank = 255; + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_BGRA, GL_UNSIGNED_BYTE, &blank); + } + } + glGenBuffers(2, buffers); + glBindBuffer(GL_ARRAY_BUFFER, buffers[0]); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_data), vertex_data, GL_STATIC_DRAW); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[0]); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(element_data), element_data, GL_STATIC_DRAW); + } else { + context->oddbuf = context->framebuf = malloc(320 * 240 * screen->format->BytesPerPixel * 2); + context->evenbuf = ((char *)context->oddbuf) + 320 * 240 * screen->format->BytesPerPixel; + } } uint8_t render_depth() @@ -95,62 +149,80 @@ char * caption = NULL; -void render_init(int width, int height, char * title, uint32_t fps, uint8_t fullscreen) +void render_init(int width, int height, char * title, uint32_t fps, uint8_t fullscreen, uint8_t use_gl) { if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK) < 0) { - fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError()); - exit(1); - } - atexit(SDL_Quit); - atexit(render_close_audio); - printf("width: %d, height: %d\n", width, height); - uint32_t flags = SDL_ANYFORMAT; - if (fullscreen) { - flags |= SDL_FULLSCREEN | SDL_HWSURFACE | SDL_DOUBLEBUF; - } else { - flags |= SDL_SWSURFACE; - } - screen = SDL_SetVideoMode(width, height, 32, flags); - if (!screen) { - fprintf(stderr, "Unable to get SDL surface: %s\n", SDL_GetError()); - exit(1); - } - if (screen->format->BytesPerPixel != 2 && screen->format->BytesPerPixel != 4) { - fprintf(stderr, "BlastEm requires a 16-bit or 32-bit surface, SDL returned a %d-bit surface\n", screen->format->BytesPerPixel * 8); - exit(1); - } - SDL_WM_SetCaption(title, title); + fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError()); + exit(1); + } + atexit(SDL_Quit); + atexit(render_close_audio); + printf("width: %d, height: %d\n", width, height); + uint32_t flags = SDL_ANYFORMAT; +#ifndef DISABLE_OPENGL + if (use_gl) + { + SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5); + SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5); + SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); + SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 0); + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); + flags = SDL_OPENGL; + } else { +#else + { +#endif + if (fullscreen) { + flags |= SDL_FULLSCREEN | SDL_HWSURFACE | SDL_DOUBLEBUF; + } else { + flags |= SDL_SWSURFACE; + } + } + screen = SDL_SetVideoMode(width, height, 32, flags); + if (!screen) { + fprintf(stderr, "Unable to get SDL surface: %s\n", SDL_GetError()); + exit(1); + } + if (!use_gl && screen->format->BytesPerPixel != 2 && screen->format->BytesPerPixel != 4) { + fprintf(stderr, "BlastEm requires a 16-bit or 32-bit surface, SDL returned a %d-bit surface\n", screen->format->BytesPerPixel * 8); + exit(1); + } +#ifndef DISABLE_OPENGL + //TODO: Fallback to plain SDL if OpenGL 2.0 not available + render_gl = use_gl; +#endif + SDL_WM_SetCaption(title, title); caption = title; - min_delay = 0; - for (int i = 0; i < 100; i++) { - uint32_t start = SDL_GetTicks(); - SDL_Delay(1); - uint32_t delay = SDL_GetTicks()-start; - if (delay > min_delay) { - min_delay = delay; - } - } - if (!min_delay) { - min_delay = 1; - } - printf("minimum delay: %d\n", min_delay); - - frame_delay = 1000/fps; - - audio_mutex = SDL_CreateMutex(); - psg_cond = SDL_CreateCond(); - ym_cond = SDL_CreateCond(); - audio_ready = SDL_CreateCond(); - - SDL_AudioSpec desired, actual; + min_delay = 0; + for (int i = 0; i < 100; i++) { + uint32_t start = SDL_GetTicks(); + SDL_Delay(1); + uint32_t delay = SDL_GetTicks()-start; + if (delay > min_delay) { + min_delay = delay; + } + } + if (!min_delay) { + min_delay = 1; + } + printf("minimum delay: %d\n", min_delay); + + frame_delay = 1000/fps; + + audio_mutex = SDL_CreateMutex(); + psg_cond = SDL_CreateCond(); + ym_cond = SDL_CreateCond(); + audio_ready = SDL_CreateCond(); + + SDL_AudioSpec desired, actual; char * rate_str = tern_find_ptr(config, "audiorate"); int rate = rate_str ? atoi(rate_str) : 0; if (!rate) { rate = 48000; } desired.freq = rate; - desired.format = AUDIO_S16SYS; - desired.channels = 2; + desired.format = AUDIO_S16SYS; + desired.channels = 2; char * samples_str = tern_find_ptr(config, "audiobuffer"); int samples = samples_str ? atoi(samples_str) : 0; if (!samples) { @@ -158,29 +230,39 @@ } printf("config says: %d\n", samples); desired.samples = samples*2; - desired.callback = audio_callback; - desired.userdata = NULL; - - if (SDL_OpenAudio(&desired, &actual) < 0) { - fprintf(stderr, "Unable to open SDL audio: %s\n", SDL_GetError()); - exit(1); - } - buffer_samples = actual.samples; - sample_rate = actual.freq; - printf("Initialized audio at frequency %d with a %d sample buffer\n", actual.freq, actual.samples); - SDL_PauseAudio(0); - num_joysticks = SDL_NumJoysticks(); - if (num_joysticks > MAX_JOYSTICKS) { - num_joysticks = MAX_JOYSTICKS; - } - for (int i = 0; i < num_joysticks; i++) { - printf("Joystick %d: %s\n", i, SDL_JoystickName(i)); - SDL_Joystick * joy = joysticks[i] = SDL_JoystickOpen(i); - if (joy) { - printf("\tNum Axes: %d\n\tNum Buttons: %d\n\tNum Hats: %d\n", SDL_JoystickNumAxes(joy), SDL_JoystickNumButtons(joy), SDL_JoystickNumHats(joy)); - } - } - SDL_JoystickEventState(SDL_ENABLE); + desired.callback = audio_callback; + desired.userdata = NULL; + + if (SDL_OpenAudio(&desired, &actual) < 0) { + fprintf(stderr, "Unable to open SDL audio: %s\n", SDL_GetError()); + exit(1); + } + buffer_samples = actual.samples; + sample_rate = actual.freq; + printf("Initialized audio at frequency %d with a %d sample buffer\n", actual.freq, actual.samples); + SDL_PauseAudio(0); + num_joysticks = SDL_NumJoysticks(); + if (num_joysticks > MAX_JOYSTICKS) { + num_joysticks = MAX_JOYSTICKS; + } + for (int i = 0; i < num_joysticks; i++) { + printf("Joystick %d: %s\n", i, SDL_JoystickName(i)); + SDL_Joystick * joy = joysticks[i] = SDL_JoystickOpen(i); + if (joy) { + printf("\tNum Axes: %d\n\tNum Buttons: %d\n\tNum Hats: %d\n", SDL_JoystickNumAxes(joy), SDL_JoystickNumButtons(joy), SDL_JoystickNumHats(joy)); + } + } + SDL_JoystickEventState(SDL_ENABLE); +} + +void render_context_gl(vdp_context * context) +{ + glBindTexture(GL_TEXTURE_2D, textures[context->framebuf == context->oddbuf ? 0 : 1]); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 320, 240, GL_BGRA, GL_UNSIGNED_BYTE, context->framebuf);; + + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + } uint32_t blankbuf[320*240]; @@ -188,65 +270,70 @@ void render_context(vdp_context * context) { uint16_t *buf_16; - uint32_t *buf_32; + uint32_t *buf_32; uint8_t b,g,r; last_frame = SDL_GetTicks(); + if (render_gl) + { + render_context_gl(context); + return; + } if (SDL_MUSTLOCK(screen)) { if (SDL_LockSurface(screen) < 0) { return; } - } - uint16_t repeat_x = screen->clip_rect.w / 320; - uint16_t repeat_y = screen->clip_rect.h / 240; - if (repeat_x > repeat_y) { - repeat_x = repeat_y; - } else { - repeat_y = repeat_x; - } - int othermask = repeat_y >> 1; - - if (screen->format->BytesPerPixel == 2) { - uint16_t *otherbuf = (context->regs[REG_MODE_4] & BIT_INTERLACE) ? context->evenbuf : (uint16_t *)blankbuf; - uint16_t * oddbuf = context->oddbuf; - buf_16 = (uint16_t *)screen->pixels; - for (int y = 0; y < 240; y++) { - for (int i = 0; i < repeat_y; i++,buf_16 += screen->pitch/2) { - uint16_t *line = buf_16; - uint16_t *src_line = (i & othermask ? otherbuf : oddbuf) + y * 320; - for (int x = 0; x < 320; x++) { - uint16_t color = *(src_line++); - for (int j = 0; j < repeat_x; j++) { - *(line++) = color; - } - } - } - } - } else { - uint32_t *otherbuf = (context->regs[REG_MODE_4] & BIT_INTERLACE) ? context->evenbuf : (uint32_t *)blankbuf; - uint32_t * oddbuf = context->oddbuf; - buf_32 = (uint32_t *)screen->pixels; - for (int y = 0; y < 240; y++) { - for (int i = 0; i < repeat_y; i++,buf_32 += screen->pitch/4) { - uint32_t *line = buf_32; - uint32_t *src_line = (i & othermask ? otherbuf : oddbuf) + y * 320; - for (int x = 0; x < 320; x++) { - uint32_t color = *(src_line++); - for (int j = 0; j < repeat_x; j++) { - *(line++) = color; - } - } - } - } - } - if ( SDL_MUSTLOCK(screen) ) { - SDL_UnlockSurface(screen); - } + } + uint16_t repeat_x = screen->clip_rect.w / 320; + uint16_t repeat_y = screen->clip_rect.h / 240; + if (repeat_x > repeat_y) { + repeat_x = repeat_y; + } else { + repeat_y = repeat_x; + } + int othermask = repeat_y >> 1; + + if (screen->format->BytesPerPixel == 2) { + uint16_t *otherbuf = (context->regs[REG_MODE_4] & BIT_INTERLACE) ? context->evenbuf : (uint16_t *)blankbuf; + uint16_t * oddbuf = context->oddbuf; + buf_16 = (uint16_t *)screen->pixels; + for (int y = 0; y < 240; y++) { + for (int i = 0; i < repeat_y; i++,buf_16 += screen->pitch/2) { + uint16_t *line = buf_16; + uint16_t *src_line = (i & othermask ? otherbuf : oddbuf) + y * 320; + for (int x = 0; x < 320; x++) { + uint16_t color = *(src_line++); + for (int j = 0; j < repeat_x; j++) { + *(line++) = color; + } + } + } + } + } else { + uint32_t *otherbuf = (context->regs[REG_MODE_4] & BIT_INTERLACE) ? context->evenbuf : (uint32_t *)blankbuf; + uint32_t * oddbuf = context->oddbuf; + buf_32 = (uint32_t *)screen->pixels; + for (int y = 0; y < 240; y++) { + for (int i = 0; i < repeat_y; i++,buf_32 += screen->pitch/4) { + uint32_t *line = buf_32; + uint32_t *src_line = (i & othermask ? otherbuf : oddbuf) + y * 320; + for (int x = 0; x < 320; x++) { + uint32_t color = *(src_line++); + for (int j = 0; j < repeat_x; j++) { + *(line++) = color; + } + } + } + } + } + if ( SDL_MUSTLOCK(screen) ) { + SDL_UnlockSurface(screen); + } //SDL_UpdateRect(screen, 0, 0, screen->clip_rect.w, screen->clip_rect.h); SDL_Flip(screen); - if (context->regs[REG_MODE_4] & BIT_INTERLACE) - { - context->framebuf = context->framebuf == context->oddbuf ? context->evenbuf : context->oddbuf; - } + if (context->regs[REG_MODE_4] & BIT_INTERLACE) + { + context->framebuf = context->framebuf == context->oddbuf ? context->evenbuf : context->oddbuf; + } } int render_joystick_num_buttons(int joystick)