Mercurial > repos > blastem
comparison m68k_core.c @ 2350:f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 16 Oct 2023 23:30:04 -0700 |
parents | 0111c8344477 |
children | 66b3f2eda0c8 |
comparison
equal
deleted
inserted
replaced
2349:f0fc6c09517d | 2350:f8b5142c06aa |
---|---|
1204 } | 1204 } |
1205 | 1205 |
1206 void resume_68k(m68k_context *context) | 1206 void resume_68k(m68k_context *context) |
1207 { | 1207 { |
1208 code_ptr addr = context->resume_pc; | 1208 code_ptr addr = context->resume_pc; |
1209 context->resume_pc = NULL; | 1209 if (!context->stack_storage_count) { |
1210 context->resume_pc = NULL; | |
1211 } | |
1210 m68k_options * options = context->options; | 1212 m68k_options * options = context->options; |
1211 context->should_return = 0; | 1213 context->should_return = 0; |
1212 options->start_context(addr, context); | 1214 options->start_context(addr, context); |
1213 } | 1215 } |
1214 | 1216 |
1218 uint16_t *reset_vec = get_native_pointer(0, (void **)context->mem_pointers, &context->options->gen); | 1220 uint16_t *reset_vec = get_native_pointer(0, (void **)context->mem_pointers, &context->options->gen); |
1219 if (!(context->status & 0x20)) { | 1221 if (!(context->status & 0x20)) { |
1220 //switching from user to system mode so swap stack pointers | 1222 //switching from user to system mode so swap stack pointers |
1221 context->aregs[8] = context->aregs[7]; | 1223 context->aregs[8] = context->aregs[7]; |
1222 } | 1224 } |
1225 context->resume_pc = NULL; | |
1226 context->stack_storage_count = 0; | |
1223 context->status = 0x27; | 1227 context->status = 0x27; |
1224 context->aregs[7] = ((uint32_t)reset_vec[0]) << 16 | reset_vec[1]; | 1228 context->aregs[7] = ((uint32_t)reset_vec[0]) << 16 | reset_vec[1]; |
1225 uint32_t address = ((uint32_t)reset_vec[2]) << 16 | reset_vec[3]; | 1229 uint32_t address = ((uint32_t)reset_vec[2]) << 16 | reset_vec[3]; |
1226 //interrupt mask may have changed so force a sync | 1230 //interrupt mask may have changed so force a sync |
1227 context->options->sync_components(context, address); | 1231 context->options->sync_components(context, address); |