Mercurial > repos > blastem
diff m68k_core.c @ 2053:3414a4423de1 segacd
Merge from default
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 15 Jan 2022 13:15:21 -0800 |
parents | c157a535ceeb |
children | 374a5ae694e8 8ee7ecbf3f21 |
line wrap: on
line diff
--- a/m68k_core.c Sat Jan 05 00:58:08 2019 -0800 +++ b/m68k_core.c Sat Jan 15 13:15:21 2022 -0800 @@ -1188,8 +1188,15 @@ { //TODO: Actually execute the M68K reset vector rather than simulating some of its behavior uint16_t *reset_vec = get_native_pointer(0, (void **)context->mem_pointers, &context->options->gen); + if (!(context->status & 0x20)) { + //switching from user to system mode so swap stack pointers + context->aregs[8] = context->aregs[7]; + } + context->status = 0x27; context->aregs[7] = reset_vec[0] << 16 | reset_vec[1]; uint32_t address = reset_vec[2] << 16 | reset_vec[3]; + //interrupt mask may have changed so force a sync + sync_components(context, address); start_68k_context(context, address); } @@ -1216,9 +1223,7 @@ m68k_context * init_68k_context(m68k_options * opts, m68k_reset_handler reset_handler) { - size_t ctx_size = sizeof(m68k_context) + ram_size(&opts->gen) / (1 << opts->gen.ram_flags_shift) / 8; - m68k_context * context = malloc(ctx_size); - memset(context, 0, ctx_size); + m68k_context * context = calloc(1, sizeof(m68k_context) + ram_size(&opts->gen) / (1 << opts->gen.ram_flags_shift) / 8); context->options = opts; context->int_cycle = CYCLE_NEVER; context->status = 0x27;