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);