| ... | ... |
@@ -59,6 +59,7 @@ static Uint32 stdin_event, audio0_event, zoom = 1; |
| 59 | 59 |
static Uint64 exec_deadline, deadline_interval, ms_interval; |
| 60 | 60 |
|
| 61 | 61 |
char *rom_path; |
| 62 |
+int window_created = 0; |
|
| 62 | 63 |
|
| 63 | 64 |
static Uint8 |
| 64 | 65 |
audio_dei(int instance, Uint8 *d, Uint8 port) |
| ... | ... |
@@ -168,6 +169,8 @@ set_window_size(SDL_Window *window, int w, int h) |
| 168 | 169 |
int |
| 169 | 170 |
emu_resize(int width, int height) |
| 170 | 171 |
{
|
| 172 |
+ if(!window_created) |
|
| 173 |
+ return 0; |
|
| 171 | 174 |
if(emu_texture != NULL) |
| 172 | 175 |
SDL_DestroyTexture(emu_texture); |
| 173 | 176 |
SDL_RenderSetLogicalSize(emu_renderer, width, height); |
| ... | ... |
@@ -191,7 +194,7 @@ emu_redraw(void) |
| 191 | 194 |
} |
| 192 | 195 |
|
| 193 | 196 |
static int |
| 194 |
-init(void) |
|
| 197 |
+emu_init(void) |
|
| 195 | 198 |
{
|
| 196 | 199 |
SDL_AudioSpec as; |
| 197 | 200 |
SDL_zero(as); |
| ... | ... |
@@ -203,13 +206,7 @@ init(void) |
| 203 | 206 |
as.userdata = NULL; |
| 204 | 207 |
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK) < 0) |
| 205 | 208 |
return system_error("sdl", SDL_GetError());
|
| 206 |
- emu_window = SDL_CreateWindow("Uxn", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, (WIDTH)*zoom, (HEIGHT)*zoom, SDL_WINDOW_SHOWN | SDL_WINDOW_ALLOW_HIGHDPI);
|
|
| 207 |
- if(emu_window == NULL) |
|
| 208 |
- return system_error("sdl_window", SDL_GetError());
|
|
| 209 |
- emu_renderer = SDL_CreateRenderer(emu_window, -1, 0); |
|
| 210 |
- if(emu_renderer == NULL) |
|
| 211 |
- return system_error("sdl_renderer", SDL_GetError());
|
|
| 212 |
- SDL_SetRenderDrawColor(emu_renderer, 0x00, 0x00, 0x00, 0xff); |
|
| 209 |
+ |
|
| 213 | 210 |
audio_id = SDL_OpenAudioDevice(NULL, 0, &as, NULL, 0); |
| 214 | 211 |
if(!audio_id) |
| 215 | 212 |
system_error("sdl_audio", SDL_GetError());
|
| ... | ... |
@@ -229,7 +226,7 @@ init(void) |
| 229 | 226 |
/* Boot */ |
| 230 | 227 |
|
| 231 | 228 |
static int |
| 232 |
-start(Uxn *u, char *rom, int queue) |
|
| 229 |
+emu_start(Uxn *u, char *rom, int queue) |
|
| 233 | 230 |
{
|
| 234 | 231 |
free(u->ram); |
| 235 | 232 |
if(!uxn_boot(u, (Uint8 *)calloc(0x10000 * RAM_PAGES, sizeof(Uint8)))) |
| ... | ... |
@@ -245,11 +242,12 @@ start(Uxn *u, char *rom, int queue) |
| 245 | 242 |
} |
| 246 | 243 |
|
| 247 | 244 |
static void |
| 248 |
-set_zoom(Uint8 z) |
|
| 245 |
+set_zoom(Uint8 z, int win) |
|
| 249 | 246 |
{
|
| 250 | 247 |
if(z >= 1) {
|
| 251 | 248 |
zoom = z; |
| 252 |
- set_window_size(emu_window, (uxn_screen.width) * zoom, (uxn_screen.height) * zoom); |
|
| 249 |
+ if(win) |
|
| 250 |
+ set_window_size(emu_window, (uxn_screen.width) * zoom, (uxn_screen.height) * zoom); |
|
| 253 | 251 |
} |
| 254 | 252 |
} |
| 255 | 253 |
|
| ... | ... |
@@ -288,8 +286,8 @@ static void |
| 288 | 286 |
emu_restart(Uxn *u) |
| 289 | 287 |
{
|
| 290 | 288 |
screen_resize(WIDTH, HEIGHT); |
| 291 |
- if(!start(u, "launcher.rom", 0)) |
|
| 292 |
- start(u, rom_path, 0); |
|
| 289 |
+ if(!emu_start(u, "launcher.rom", 0)) |
|
| 290 |
+ emu_start(u, rom_path, 0); |
|
| 293 | 291 |
} |
| 294 | 292 |
|
| 295 | 293 |
static Uint8 |
| ... | ... |
@@ -352,7 +350,7 @@ handle_events(Uxn *u) |
| 352 | 350 |
emu_redraw(); |
| 353 | 351 |
else if(event.type == SDL_DROPFILE) {
|
| 354 | 352 |
screen_resize(WIDTH, HEIGHT); |
| 355 |
- start(u, event.drop.file, 0); |
|
| 353 |
+ emu_start(u, event.drop.file, 0); |
|
| 356 | 354 |
SDL_free(event.drop.file); |
| 357 | 355 |
} |
| 358 | 356 |
/* Audio */ |
| ... | ... |
@@ -377,7 +375,7 @@ handle_events(Uxn *u) |
| 377 | 375 |
else if(get_button(&event)) |
| 378 | 376 |
controller_down(u, &u->dev[0x80], get_button(&event)); |
| 379 | 377 |
else if(event.key.keysym.sym == SDLK_F1) |
| 380 |
- set_zoom(zoom == 3 ? 1 : zoom + 1); |
|
| 378 |
+ set_zoom(zoom == 3 ? 1 : zoom + 1, 1); |
|
| 381 | 379 |
else if(event.key.keysym.sym == SDLK_F2) |
| 382 | 380 |
system_inspect(u); |
| 383 | 381 |
else if(event.key.keysym.sym == SDLK_F3) |
| ... | ... |
@@ -443,7 +441,7 @@ handle_events(Uxn *u) |
| 443 | 441 |
} |
| 444 | 442 |
|
| 445 | 443 |
static int |
| 446 |
-run(Uxn *u) |
|
| 444 |
+emu_run(Uxn *u) |
|
| 447 | 445 |
{
|
| 448 | 446 |
Uint64 next_refresh = 0; |
| 449 | 447 |
Uint64 now; |
| ... | ... |
@@ -475,26 +473,41 @@ run(Uxn *u) |
| 475 | 473 |
} |
| 476 | 474 |
} |
| 477 | 475 |
|
| 476 |
+int |
|
| 477 |
+emu_show(void) |
|
| 478 |
+{
|
|
| 479 |
+ window_created = 1; |
|
| 480 |
+ emu_window = SDL_CreateWindow("Uxn", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, uxn_screen.width * zoom, uxn_screen.height * zoom, SDL_WINDOW_SHOWN | SDL_WINDOW_ALLOW_HIGHDPI);
|
|
| 481 |
+ if(emu_window == NULL) |
|
| 482 |
+ return system_error("sdl_window", SDL_GetError());
|
|
| 483 |
+ emu_renderer = SDL_CreateRenderer(emu_window, -1, 0); |
|
| 484 |
+ if(emu_renderer == NULL) |
|
| 485 |
+ return system_error("sdl_renderer", SDL_GetError());
|
|
| 486 |
+ SDL_SetRenderDrawColor(emu_renderer, 0x00, 0x00, 0x00, 0xff); |
|
| 487 |
+ emu_resize(uxn_screen.width, uxn_screen.height); |
|
| 488 |
+ return 1; |
|
| 489 |
+} |
|
| 490 |
+ |
|
| 478 | 491 |
int |
| 479 | 492 |
main(int argc, char **argv) |
| 480 | 493 |
{
|
| 481 | 494 |
SDL_DisplayMode DM; |
| 482 | 495 |
Uxn u = {0};
|
| 483 | 496 |
int i = 1; |
| 484 |
- if(!init()) |
|
| 497 |
+ if(!emu_init()) |
|
| 485 | 498 |
return system_error("Init", "Failed to initialize emulator.");
|
| 486 | 499 |
/* default resolution */ |
| 487 | 500 |
screen_resize(WIDTH, HEIGHT); |
| 488 | 501 |
/* default zoom */ |
| 489 | 502 |
if(argc > 1 && (strcmp(argv[i], "-1x") == 0 || strcmp(argv[i], "-2x") == 0 || strcmp(argv[i], "-3x") == 0)) |
| 490 |
- set_zoom(argv[i++][1] - '0'); |
|
| 503 |
+ set_zoom(argv[i++][1] - '0', 0); |
|
| 491 | 504 |
else if(SDL_GetCurrentDisplayMode(0, &DM) == 0) |
| 492 |
- set_zoom(DM.w / 1280); |
|
| 505 |
+ set_zoom(DM.w / 1280, 0); |
|
| 493 | 506 |
/* load rom */ |
| 494 | 507 |
if(i == argc) |
| 495 | 508 |
return system_error("usage", "uxnemu [-2x][-3x] file.rom [args...]");
|
| 496 | 509 |
rom_path = argv[i++]; |
| 497 |
- if(!start(&u, rom_path, argc - i)) |
|
| 510 |
+ if(!emu_start(&u, rom_path, argc - i)) |
|
| 498 | 511 |
return system_error("Start", "Failed");
|
| 499 | 512 |
/* read arguments */ |
| 500 | 513 |
for(; i < argc; i++) {
|
| ... | ... |
@@ -503,7 +516,8 @@ main(int argc, char **argv) |
| 503 | 516 |
console_input(&u, '\n', i == argc - 1 ? CONSOLE_END : CONSOLE_EOA); |
| 504 | 517 |
} |
| 505 | 518 |
/* start rom */ |
| 506 |
- run(&u); |
|
| 519 |
+ emu_show(); |
|
| 520 |
+ emu_run(&u); |
|
| 507 | 521 |
/* finished */ |
| 508 | 522 |
#ifdef _WIN32 |
| 509 | 523 |
#pragma GCC diagnostic ignored "-Wint-to-pointer-cast" |