Mercurial > repos > blastem
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); |