| ... | ... |
@@ -28,5 +28,6 @@ void screen_resize(Uint16 width, Uint16 height); |
| 28 | 28 |
void screen_change(Uint16 x1, Uint16 y1, Uint16 x2, Uint16 y2); |
| 29 | 29 |
void screen_redraw(void); |
| 30 | 30 |
void screen_debugger(Uxn *u); |
| 31 |
+ |
|
| 31 | 32 |
Uint8 screen_dei(Uxn *u, Uint8 addr); |
| 32 | 33 |
void screen_deo(Uint8 *ram, Uint8 *d, Uint8 port); |
| ... | ... |
@@ -96,12 +96,28 @@ system_version(char *name, char *date) |
| 96 | 96 |
return 0; |
| 97 | 97 |
} |
| 98 | 98 |
|
| 99 |
+void |
|
| 100 |
+system_reboot(Uxn *u, char *rom, int soft) |
|
| 101 |
+{
|
|
| 102 |
+ int i; |
|
| 103 |
+ for(i = 0x100 * soft; i < 0x10000; i++) |
|
| 104 |
+ u->ram[i] = 0; |
|
| 105 |
+ for(i = 0x0; i < 0x100; i++) |
|
| 106 |
+ u->dev[i] = 0; |
|
| 107 |
+ u->wst.ptr = 0; |
|
| 108 |
+ u->rst.ptr = 0; |
|
| 109 |
+ if(system_load(u, boot_rom)) |
|
| 110 |
+ if(uxn_eval(u, PAGE_PROGRAM)) |
|
| 111 |
+ boot_rom = rom; |
|
| 112 |
+} |
|
| 113 |
+ |
|
| 99 | 114 |
int |
| 100 | 115 |
system_init(Uxn *u, Uint8 *ram, char *rom) |
| 101 | 116 |
{
|
| 102 | 117 |
u->ram = ram; |
| 103 | 118 |
if(!system_load(u, rom)) |
| 104 |
- return system_error("Init", "Failed to load rom.");
|
|
| 119 |
+ if(!system_load(u, "boot.rom")) |
|
| 120 |
+ return system_error("Init", "Failed to load rom.");
|
|
| 105 | 121 |
boot_rom = rom; |
| 106 | 122 |
return 1; |
| 107 | 123 |
} |
| ... | ... |
@@ -18,9 +18,11 @@ WITH REGARD TO THIS SOFTWARE. |
| 18 | 18 |
extern char *boot_rom; |
| 19 | 19 |
|
| 20 | 20 |
void system_connect(Uint8 device, Uint8 ver, Uint16 dei, Uint16 deo); |
| 21 |
+void system_reboot(Uxn *u, char *rom, int soft); |
|
| 22 |
+void system_inspect(Uxn *u); |
|
| 21 | 23 |
int system_version(char *emulator, char *date); |
| 22 | 24 |
int system_load(Uxn *u, char *filename); |
| 23 |
-void system_inspect(Uxn *u); |
|
| 24 | 25 |
int system_error(char *msg, const char *err); |
| 25 | 26 |
int system_init(Uxn *u, Uint8 *ram, char *rom); |
| 27 |
+ |
|
| 26 | 28 |
void system_deo(Uxn *u, Uint8 *d, Uint8 port); |
| ... | ... |
@@ -255,43 +255,14 @@ emu_init(void) |
| 255 | 255 |
return 1; |
| 256 | 256 |
} |
| 257 | 257 |
|
| 258 |
-static int |
|
| 259 |
-emu_start(Uxn *u, char *rom) |
|
| 260 |
-{
|
|
| 261 |
- exec_deadline = SDL_GetPerformanceCounter() + deadline_interval; |
|
| 262 |
- screen_resize(WIDTH, HEIGHT); |
|
| 263 |
- if(!uxn_eval(u, PAGE_PROGRAM)) |
|
| 264 |
- return system_error("Boot", "Failed to eval rom.");
|
|
| 265 |
- SDL_SetWindowTitle(emu_window, rom); |
|
| 266 |
- return 1; |
|
| 267 |
-} |
|
| 268 |
- |
|
| 269 | 258 |
static void |
| 270 |
-emu_restart(Uxn *u) |
|
| 259 |
+emu_restart(Uxn *u, char *rom, int soft) |
|
| 271 | 260 |
{
|
| 272 | 261 |
screen_resize(WIDTH, HEIGHT); |
| 273 |
- SDL_SetWindowTitle(emu_window, boot_rom); |
|
| 274 |
- if(!emu_start(u, "launcher.rom")) |
|
| 275 |
- emu_start(u, boot_rom); |
|
| 276 |
-} |
|
| 277 |
- |
|
| 278 |
-static int |
|
| 279 |
-emu_restart_soft(Uxn *u) |
|
| 280 |
-{
|
|
| 281 |
- int i; |
|
| 282 |
- for(i = 0x100; i < 0x10000; i++) |
|
| 283 |
- u->ram[i] = 0; |
|
| 284 |
- for(i = 0x0; i < 0x100; i++) |
|
| 285 |
- u->dev[i] = 0; |
|
| 286 |
- u->wst.ptr = 0; |
|
| 287 |
- u->rst.ptr = 0; |
|
| 288 | 262 |
screen_fill(uxn_screen.bg, 0, 0, uxn_screen.width, uxn_screen.height, 0); |
| 289 | 263 |
screen_fill(uxn_screen.fg, 0, 0, uxn_screen.width, uxn_screen.height, 0); |
| 290 |
- if(!system_load(u, boot_rom)) |
|
| 291 |
- return system_error("Boot", "Failed to load rom.");
|
|
| 292 |
- if(!uxn_eval(u, PAGE_PROGRAM)) |
|
| 293 |
- return system_error("Boot", "Failed to eval rom.");
|
|
| 294 |
- return 1; |
|
| 264 |
+ system_reboot(u, rom, soft); |
|
| 265 |
+ SDL_SetWindowTitle(emu_window, boot_rom); |
|
| 295 | 266 |
} |
| 296 | 267 |
|
| 297 | 268 |
static void |
| ... | ... |
@@ -384,8 +355,7 @@ handle_events(Uxn *u) |
| 384 | 355 |
else if(event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_EXPOSED) |
| 385 | 356 |
emu_redraw(u); |
| 386 | 357 |
else if(event.type == SDL_DROPFILE) {
|
| 387 |
- screen_resize(WIDTH, HEIGHT); |
|
| 388 |
- emu_start(u, event.drop.file); |
|
| 358 |
+ emu_restart(u, event.drop.file, 0); |
|
| 389 | 359 |
SDL_free(event.drop.file); |
| 390 | 360 |
} |
| 391 | 361 |
/* Audio */ |
| ... | ... |
@@ -416,9 +386,9 @@ handle_events(Uxn *u) |
| 416 | 386 |
else if(event.key.keysym.sym == SDLK_F3) |
| 417 | 387 |
capture_screen(); |
| 418 | 388 |
else if(event.key.keysym.sym == SDLK_F4) |
| 419 |
- emu_restart(u); |
|
| 389 |
+ emu_restart(u, boot_rom, 0); |
|
| 420 | 390 |
else if(event.key.keysym.sym == SDLK_F5) |
| 421 |
- emu_restart_soft(u); |
|
| 391 |
+ emu_restart(u, boot_rom, 1); |
|
| 422 | 392 |
ksym = event.key.keysym.sym; |
| 423 | 393 |
if(SDL_PeepEvents(&event, 1, SDL_PEEKEVENT, SDL_KEYUP, SDL_KEYUP) == 1 && ksym == event.key.keysym.sym) |
| 424 | 394 |
return 1; |