comparison gst.c @ 2500:d44fe974fb85

Get blastem compiling with new 68K core
author Michael Pavone <pavone@retrodev.com>
date Tue, 30 Apr 2024 22:32:08 -0700
parents 9ead0fe69d9b
children
comparison
equal deleted inserted replaced
2499:d74d3998482c 2500:d44fe974fb85
84 curpos += sizeof(uint32_t); 84 curpos += sizeof(uint32_t);
85 } 85 }
86 uint32_t pc = read_le_32(buffer + GST_68K_PC_OFFSET); 86 uint32_t pc = read_le_32(buffer + GST_68K_PC_OFFSET);
87 uint16_t sr = read_le_16(buffer + GST_68K_SR_OFFSET); 87 uint16_t sr = read_le_16(buffer + GST_68K_SR_OFFSET);
88 context->status = sr >> 8; 88 context->status = sr >> 8;
89 #ifdef NEW_CORE
90 //TODO: implement me
91 #else
89 for (int flag = 4; flag >= 0; flag--) { 92 for (int flag = 4; flag >= 0; flag--) {
90 context->flags[flag] = sr & 1; 93 context->flags[flag] = sr & 1;
91 sr >>= 1; 94 sr >>= 1;
92 } 95 }
96 #endif
93 if (context->status & (1 << 5)) { 97 if (context->status & (1 << 5)) {
94 context->aregs[8] = read_le_32(buffer + GST_68K_USP_OFFSET); 98 context->aregs[8] = read_le_32(buffer + GST_68K_USP_OFFSET);
95 } else { 99 } else {
96 context->aregs[8] = read_le_32(buffer + GST_68K_SSP_OFFSET); 100 context->aregs[8] = read_le_32(buffer + GST_68K_SSP_OFFSET);
97 } 101 }
111 write_le_32(curpos, context->aregs[i]); 115 write_le_32(curpos, context->aregs[i]);
112 curpos += sizeof(uint32_t); 116 curpos += sizeof(uint32_t);
113 } 117 }
114 write_le_32(buffer + GST_68K_PC_OFFSET, pc); 118 write_le_32(buffer + GST_68K_PC_OFFSET, pc);
115 uint16_t sr = context->status << 3; 119 uint16_t sr = context->status << 3;
120 #ifdef NEW_CORE
121 //TODO: implement me
122 #else
116 for (int flag = 4; flag >= 0; flag--) { 123 for (int flag = 4; flag >= 0; flag--) {
117 sr <<= 1; 124 sr <<= 1;
118 sr |= context->flags[flag]; 125 sr |= context->flags[flag];
119 } 126 }
127 #endif
120 write_le_16(buffer + GST_68K_SR_OFFSET, sr); 128 write_le_16(buffer + GST_68K_SR_OFFSET, sr);
121 if (context->status & (1 << 5)) { 129 if (context->status & (1 << 5)) {
122 write_le_32(buffer + GST_68K_USP_OFFSET, context->aregs[8]); 130 write_le_32(buffer + GST_68K_USP_OFFSET, context->aregs[8]);
123 write_le_32(buffer + GST_68K_SSP_OFFSET, context->aregs[7]); 131 write_le_32(buffer + GST_68K_SSP_OFFSET, context->aregs[7]);
124 } else { 132 } else {
410 return 0; 418 return 0;
411 } 419 }
412 return 1; 420 return 1;
413 } 421 }
414 422
423 #ifndef NEW_CORE
415 #include "m68k_internal.h" //needed for get_native_address_trans, should be eliminated once handling of PC is cleaned up 424 #include "m68k_internal.h" //needed for get_native_address_trans, should be eliminated once handling of PC is cleaned up
425 #endif
416 uint32_t load_gst(genesis_context * gen, char * fname) 426 uint32_t load_gst(genesis_context * gen, char * fname)
417 { 427 {
418 char buffer[4096]; 428 char buffer[4096];
419 FILE * gstfile = fopen(fname, "rb"); 429 FILE * gstfile = fopen(fname, "rb");
420 if (!gstfile) { 430 if (!gstfile) {
460 m68k_handle_code_write(0xFF0000 | (i << 1), gen->m68k); 470 m68k_handle_code_write(0xFF0000 | (i << 1), gen->m68k);
461 } 471 }
462 i++; 472 i++;
463 } 473 }
464 } 474 }
475 #ifdef NEW_CORE
476 gen->m68k->pc = pc;
477 #else
465 gen->m68k->resume_pc = get_native_address_trans(gen->m68k, pc); 478 gen->m68k->resume_pc = get_native_address_trans(gen->m68k, pc);
479 #endif
466 fclose(gstfile); 480 fclose(gstfile);
467 return pc; 481 return pc;
468 482
469 error_close: 483 error_close:
470 fclose(gstfile); 484 fclose(gstfile);