annotate m68k_util.c @ 2684:c649bcc18487

Fix crash bug in Android fallback font loading path
author Michael Pavone <pavone@retrodev.com>
date Sat, 29 Mar 2025 23:54:45 -0700
parents 7e86ec94c899
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1951
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1 #include <string.h>
2676
7e86ec94c899 Implement breakpoints in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2666
diff changeset
2 #ifdef DEBUG_DISASM
7e86ec94c899 Implement breakpoints in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2666
diff changeset
3 #include "68kinst.h"
7e86ec94c899 Implement breakpoints in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2666
diff changeset
4 #endif
1951
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
5
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
6 void m68k_read_8(m68k_context *context)
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
7 {
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
8 context->cycles += 4 * context->opts->gen.clock_divider;
2651
1072cc337822 Implement TAS in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2645
diff changeset
9 #ifdef DEBUG_DISASM
1072cc337822 Implement TAS in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2645
diff changeset
10 uint32_t tmp = context->scratch1;
1072cc337822 Implement TAS in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2645
diff changeset
11 #endif
2666
38c281ef57b0 Memory access optimizaiton in new 68K core that gives a modest speed bump on average and will allow low-cost watchpoints
Michael Pavone <pavone@retrodev.com>
parents: 2656
diff changeset
12 uint32_t address = context->scratch1 & context->opts->gen.address_mask;
38c281ef57b0 Memory access optimizaiton in new 68K core that gives a modest speed bump on average and will allow low-cost watchpoints
Michael Pavone <pavone@retrodev.com>
parents: 2656
diff changeset
13 uint32_t index = address >> 16;
38c281ef57b0 Memory access optimizaiton in new 68K core that gives a modest speed bump on average and will allow low-cost watchpoints
Michael Pavone <pavone@retrodev.com>
parents: 2656
diff changeset
14 context->scratch1 = context->read8[index](address, context, context->read8_data[index]);
2651
1072cc337822 Implement TAS in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2645
diff changeset
15 #ifdef DEBUG_DISASM
2656
ec02a08196d5 Remove some debug cruft
Michael Pavone <pavone@retrodev.com>
parents: 2654
diff changeset
16 printf("Read.b %05X: %02X\n", tmp, context->scratch1);
2651
1072cc337822 Implement TAS in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2645
diff changeset
17 #endif
1951
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
18 }
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
19
2676
7e86ec94c899 Implement breakpoints in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2666
diff changeset
20 uint16_t m68k_instruction_fetch(uint32_t address, void *vcontext)
2590
e602dbf776d8 Fix abcd and implement sbcd and nbcd in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2587
diff changeset
21 {
e602dbf776d8 Fix abcd and implement sbcd and nbcd in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2587
diff changeset
22 m68k_context *context = vcontext;
2676
7e86ec94c899 Implement breakpoints in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2666
diff changeset
23 return read_word(address, (void **)context->mem_pointers, &context->opts->gen, context);
2590
e602dbf776d8 Fix abcd and implement sbcd and nbcd in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2587
diff changeset
24 }
2676
7e86ec94c899 Implement breakpoints in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2666
diff changeset
25
1951
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
26 void m68k_read_16(m68k_context *context)
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
27 {
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
28 context->cycles += 4 * context->opts->gen.clock_divider;
2590
e602dbf776d8 Fix abcd and implement sbcd and nbcd in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2587
diff changeset
29 #ifdef DEBUG_DISASM
2587
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
30 uint32_t tmp = context->scratch1;
2590
e602dbf776d8 Fix abcd and implement sbcd and nbcd in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2587
diff changeset
31 #endif
2666
38c281ef57b0 Memory access optimizaiton in new 68K core that gives a modest speed bump on average and will allow low-cost watchpoints
Michael Pavone <pavone@retrodev.com>
parents: 2656
diff changeset
32 uint32_t address = context->scratch1 & context->opts->gen.address_mask;
38c281ef57b0 Memory access optimizaiton in new 68K core that gives a modest speed bump on average and will allow low-cost watchpoints
Michael Pavone <pavone@retrodev.com>
parents: 2656
diff changeset
33 uint32_t index = address >> 16;
38c281ef57b0 Memory access optimizaiton in new 68K core that gives a modest speed bump on average and will allow low-cost watchpoints
Michael Pavone <pavone@retrodev.com>
parents: 2656
diff changeset
34 context->scratch1 = context->read16[index](address, context, context->read16_data[index]);
2590
e602dbf776d8 Fix abcd and implement sbcd and nbcd in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2587
diff changeset
35 #ifdef DEBUG_DISASM
e602dbf776d8 Fix abcd and implement sbcd and nbcd in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2587
diff changeset
36 if (tmp == context->pc) {
e602dbf776d8 Fix abcd and implement sbcd and nbcd in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2587
diff changeset
37 m68kinst inst;
e602dbf776d8 Fix abcd and implement sbcd and nbcd in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2587
diff changeset
38 m68k_decode(debug_disasm_fetch, context, &inst, tmp);
e602dbf776d8 Fix abcd and implement sbcd and nbcd in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2587
diff changeset
39 static char disasm_buf[256];
e602dbf776d8 Fix abcd and implement sbcd and nbcd in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2587
diff changeset
40 m68k_disasm(&inst, disasm_buf);
2651
1072cc337822 Implement TAS in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2645
diff changeset
41 printf("Fetch %05X: %04X - %s, d0=%X, d1=%X, d2=%X, d3=%X, d4=%X, d6=%X, d7=%X, a3=%X, a7=%X, xflag=%d\n",
1072cc337822 Implement TAS in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2645
diff changeset
42 tmp, context->scratch1, disasm_buf, context->dregs[0], context->dregs[1], context->dregs[2], context->dregs[3],
1072cc337822 Implement TAS in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2645
diff changeset
43 context->dregs[4], context->dregs[6], context->dregs[7], context->aregs[3], context->aregs[7], context->xflag
1072cc337822 Implement TAS in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2645
diff changeset
44 );
2614
c5314c0779c2 Extended debug output in debug mode of new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2594
diff changeset
45 } else {
c5314c0779c2 Extended debug output in debug mode of new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2594
diff changeset
46 printf("Read %05X: %04X\n", tmp, context->scratch1);
2590
e602dbf776d8 Fix abcd and implement sbcd and nbcd in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2587
diff changeset
47 }
e602dbf776d8 Fix abcd and implement sbcd and nbcd in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2587
diff changeset
48 #endif
1951
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
49 }
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
50
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
51 void m68k_write_8(m68k_context *context)
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
52 {
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
53 context->cycles += 4 * context->opts->gen.clock_divider;
2666
38c281ef57b0 Memory access optimizaiton in new 68K core that gives a modest speed bump on average and will allow low-cost watchpoints
Michael Pavone <pavone@retrodev.com>
parents: 2656
diff changeset
54 uint32_t address = context->scratch2 & context->opts->gen.address_mask;
38c281ef57b0 Memory access optimizaiton in new 68K core that gives a modest speed bump on average and will allow low-cost watchpoints
Michael Pavone <pavone@retrodev.com>
parents: 2656
diff changeset
55 uint32_t index = address >> 16;
38c281ef57b0 Memory access optimizaiton in new 68K core that gives a modest speed bump on average and will allow low-cost watchpoints
Michael Pavone <pavone@retrodev.com>
parents: 2656
diff changeset
56 context->write8[index](address, context, context->scratch1, context->write8_data[index]);
2651
1072cc337822 Implement TAS in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2645
diff changeset
57 #ifdef DEBUG_DISASM
1072cc337822 Implement TAS in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2645
diff changeset
58 printf("Write.b %05X: %02X\n", context->scratch2, context->scratch1);
1072cc337822 Implement TAS in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2645
diff changeset
59 #endif
1072cc337822 Implement TAS in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2645
diff changeset
60 }
1072cc337822 Implement TAS in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2645
diff changeset
61
1072cc337822 Implement TAS in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2645
diff changeset
62 void m68k_rmw_writeback(m68k_context *context)
1072cc337822 Implement TAS in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2645
diff changeset
63 {
1072cc337822 Implement TAS in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2645
diff changeset
64 if (context->opts->gen.flags & M68K_OPT_BROKEN_READ_MODIFY) {
1072cc337822 Implement TAS in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2645
diff changeset
65 context->cycles += 4 * context->opts->gen.clock_divider;
1072cc337822 Implement TAS in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2645
diff changeset
66 } else {
2666
38c281ef57b0 Memory access optimizaiton in new 68K core that gives a modest speed bump on average and will allow low-cost watchpoints
Michael Pavone <pavone@retrodev.com>
parents: 2656
diff changeset
67 m68k_write_8(context);
2651
1072cc337822 Implement TAS in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2645
diff changeset
68 }
1951
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
69 }
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
70
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
71 void m68k_write_16(m68k_context *context)
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
72 {
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
73 context->cycles += 4 * context->opts->gen.clock_divider;
2666
38c281ef57b0 Memory access optimizaiton in new 68K core that gives a modest speed bump on average and will allow low-cost watchpoints
Michael Pavone <pavone@retrodev.com>
parents: 2656
diff changeset
74 int32_t address = context->scratch2 & context->opts->gen.address_mask;
38c281ef57b0 Memory access optimizaiton in new 68K core that gives a modest speed bump on average and will allow low-cost watchpoints
Michael Pavone <pavone@retrodev.com>
parents: 2656
diff changeset
75 uint32_t index = address >> 16;
38c281ef57b0 Memory access optimizaiton in new 68K core that gives a modest speed bump on average and will allow low-cost watchpoints
Michael Pavone <pavone@retrodev.com>
parents: 2656
diff changeset
76 context->write16[index](address, context, context->scratch1, context->write16_data[index]);
2651
1072cc337822 Implement TAS in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2645
diff changeset
77 #ifdef DEBUG_DISASM
1072cc337822 Implement TAS in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2645
diff changeset
78 printf("Write %05X: %04X\n", context->scratch2, context->scratch1);
1072cc337822 Implement TAS in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2645
diff changeset
79 #endif
1951
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
80 }
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
81
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
82 void m68k_sync_cycle(m68k_context *context, uint32_t target_cycle)
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
83 {
2577
5f725429d08f WIP changes to new CPU core for rotate instructions and to get interrupts more functional
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
84 context->sync_cycle = target_cycle; //why?
5f725429d08f WIP changes to new CPU core for rotate instructions and to get interrupts more functional
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
85 context->sync_components(context, 0);
1951
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
86 }
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
87
2587
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
88 static void divu(m68k_context *context, uint32_t dividend_reg, uint32_t divisor)
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
89 {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
90 uint32_t dividend = context->dregs[dividend_reg];
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
91 uint32_t divisor_shift = divisor << 16;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
92 uint16_t quotient = 0;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
93 uint8_t force = 0;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
94 uint16_t bit = 0;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
95 uint32_t cycles = 2;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
96 if (divisor_shift < dividend) {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
97 context->nflag = 128;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
98 context->zflag = 0;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
99 context->vflag = 128;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
100 context->cycles += 6 * context->opts->gen.clock_divider;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
101 return;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
102 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
103 for (int i = 0; i < 16; i++)
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
104 {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
105 force = dividend >> 31;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
106 quotient = quotient << 1 | bit;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
107 dividend = dividend << 1;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
108
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
109 if (force || dividend >= divisor_shift) {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
110 dividend -= divisor_shift;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
111 cycles += force ? 4 : 6;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
112 bit = 1;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
113 } else {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
114 bit = 0;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
115 cycles += 8;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
116 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
117 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
118 cycles += force ? 6 : bit ? 4 : 2;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
119 context->cycles += cycles * context->opts->gen.clock_divider;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
120 quotient = quotient << 1 | bit;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
121 context->dregs[dividend_reg] = dividend | quotient;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
122 context->vflag = 0;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
123 context->nflag = quotient >> 8 & 128;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
124 context->zflag = quotient == 0;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
125 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
126
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
127 static void divs(m68k_context *context, uint32_t dividend_reg, uint32_t divisor)
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
128 {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
129 uint32_t dividend = context->dregs[dividend_reg];
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
130 uint32_t divisor_shift = divisor << 16;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
131 uint32_t orig_divisor = divisor_shift, orig_dividend = dividend;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
132 if (divisor_shift & 0x80000000) {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
133 divisor_shift = 0 - divisor_shift;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
134 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
135
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
136 uint32_t cycles = 8;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
137 if (dividend & 0x80000000) {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
138 //dvs10
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
139 dividend = 0 - dividend;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
140 cycles += 2;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
141 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
142 if (divisor_shift <= dividend) {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
143 context->vflag = 128;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
144 context->nflag = 128;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
145 context->zflag = 0;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
146 cycles += 4;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
147 context->cycles += cycles * context->opts->gen.clock_divider;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
148 return;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
149 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
150 uint16_t quotient = 0;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
151 uint16_t bit = 0;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
152 for (int i = 0; i < 15; i++)
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
153 {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
154 quotient = quotient << 1 | bit;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
155 dividend = dividend << 1;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
156
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
157 if (dividend >= divisor_shift) {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
158 dividend -= divisor_shift;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
159 cycles += 6;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
160 bit = 1;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
161 } else {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
162 bit = 0;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
163 cycles += 8;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
164 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
165 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
166 quotient = quotient << 1 | bit;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
167 dividend = dividend << 1;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
168 if (dividend >= divisor_shift) {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
169 dividend -= divisor_shift;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
170 quotient = quotient << 1 | 1;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
171 } else {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
172 quotient = quotient << 1;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
173 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
174 cycles += 4;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
175
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
176 context->vflag = 0;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
177 if (orig_divisor & 0x80000000) {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
178 cycles += 16; //was 10
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
179 if (orig_dividend & 0x80000000) {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
180 if (quotient & 0x8000) {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
181 context->vflag = 128;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
182 context->nflag = 128;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
183 context->zflag = 0;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
184 context->cycles += cycles * context->opts->gen.clock_divider;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
185 return;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
186 } else {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
187 dividend = -dividend;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
188 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
189 } else {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
190 quotient = -quotient;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
191 if (quotient && !(quotient & 0x8000)) {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
192 context->vflag = 128;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
193 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
194 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
195 } else if (orig_dividend & 0x80000000) {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
196 cycles += 18; // was 12
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
197 quotient = -quotient;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
198 if (quotient && !(quotient & 0x8000)) {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
199 context->vflag = 128;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
200 } else {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
201 dividend = -dividend;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
202 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
203 } else {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
204 cycles += 14; //was 10
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
205 if (quotient & 0x8000) {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
206 context->vflag= 128;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
207 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
208 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
209 if (context->vflag) {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
210 context->nflag = 128;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
211 context->zflag = 0;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
212 context->cycles += cycles * context->opts->gen.clock_divider;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
213 return;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
214 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
215 context->nflag = (quotient & 0x8000) ? 128 : 0;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
216 context->zflag = quotient == 0;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
217 //V was cleared above, C is cleared by the generated machine code
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
218 context->cycles += cycles * context->opts->gen.clock_divider;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
219 context->dregs[dividend_reg] = dividend | quotient;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
220 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
221
2577
5f725429d08f WIP changes to new CPU core for rotate instructions and to get interrupts more functional
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
222 static sync_fun *sync_comp_tmp;
5f725429d08f WIP changes to new CPU core for rotate instructions and to get interrupts more functional
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
223 static int_ack_fun int_ack_tmp;
5f725429d08f WIP changes to new CPU core for rotate instructions and to get interrupts more functional
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
224 void init_m68k_opts(m68k_options *opts, memmap_chunk * memmap, uint32_t num_chunks, uint32_t clock_divider, sync_fun *sync_components, int_ack_fun int_ack)
1951
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
225 {
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
226 memset(opts, 0, sizeof(*opts));
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
227 opts->gen.memmap = memmap;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
228 opts->gen.memmap_chunks = num_chunks;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
229 opts->gen.address_mask = 0xFFFFFF;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
230 opts->gen.byte_swap = 1;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
231 opts->gen.max_address = 0x1000000;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
232 opts->gen.bus_cycles = 4;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
233 opts->gen.clock_divider = clock_divider;
2666
38c281ef57b0 Memory access optimizaiton in new 68K core that gives a modest speed bump on average and will allow low-cost watchpoints
Michael Pavone <pavone@retrodev.com>
parents: 2656
diff changeset
234 opts->gen.mem_ptr_off = offsetof(m68k_context, mem_pointers);
2577
5f725429d08f WIP changes to new CPU core for rotate instructions and to get interrupts more functional
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
235 sync_comp_tmp = sync_components;
5f725429d08f WIP changes to new CPU core for rotate instructions and to get interrupts more functional
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
236 int_ack_tmp = int_ack;
1951
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
237 }
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
238
2577
5f725429d08f WIP changes to new CPU core for rotate instructions and to get interrupts more functional
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
239 m68k_context *init_68k_context(m68k_options * opts, m68k_reset_handler *reset_handler)
1951
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
240 {
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
241 m68k_context *context = calloc(1, sizeof(m68k_context));
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
242 context->opts = opts;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
243 context->reset_handler = reset_handler;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
244 context->int_cycle = 0xFFFFFFFFU;
2580
939b818df589 Get 68K interrupts working in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2577
diff changeset
245 context->int_pending = 255;
2577
5f725429d08f WIP changes to new CPU core for rotate instructions and to get interrupts more functional
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
246 context->sync_components = sync_comp_tmp;
2666
38c281ef57b0 Memory access optimizaiton in new 68K core that gives a modest speed bump on average and will allow low-cost watchpoints
Michael Pavone <pavone@retrodev.com>
parents: 2656
diff changeset
247 for (uint32_t i = 0; i < 256; i++)
38c281ef57b0 Memory access optimizaiton in new 68K core that gives a modest speed bump on average and will allow low-cost watchpoints
Michael Pavone <pavone@retrodev.com>
parents: 2656
diff changeset
248 {
38c281ef57b0 Memory access optimizaiton in new 68K core that gives a modest speed bump on average and will allow low-cost watchpoints
Michael Pavone <pavone@retrodev.com>
parents: 2656
diff changeset
249 context->read16[i] = get_interp_read_16(context, &opts->gen, i << 16, (i + 1) << 16, context->read16_data + i);
38c281ef57b0 Memory access optimizaiton in new 68K core that gives a modest speed bump on average and will allow low-cost watchpoints
Michael Pavone <pavone@retrodev.com>
parents: 2656
diff changeset
250 context->read8[i] = get_interp_read_8(context, &opts->gen, i << 16, (i + 1) << 16, context->read8_data + i);
38c281ef57b0 Memory access optimizaiton in new 68K core that gives a modest speed bump on average and will allow low-cost watchpoints
Michael Pavone <pavone@retrodev.com>
parents: 2656
diff changeset
251 context->write16[i] = get_interp_write_16(context, &opts->gen, i << 16, (i + 1) << 16, context->write16_data + i);
38c281ef57b0 Memory access optimizaiton in new 68K core that gives a modest speed bump on average and will allow low-cost watchpoints
Michael Pavone <pavone@retrodev.com>
parents: 2656
diff changeset
252 context->write8[i] = get_interp_write_8(context, &opts->gen, i << 16, (i + 1) << 16, context->write8_data + i);
38c281ef57b0 Memory access optimizaiton in new 68K core that gives a modest speed bump on average and will allow low-cost watchpoints
Michael Pavone <pavone@retrodev.com>
parents: 2656
diff changeset
253 }
2577
5f725429d08f WIP changes to new CPU core for rotate instructions and to get interrupts more functional
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
254 sync_comp_tmp = NULL;
5f725429d08f WIP changes to new CPU core for rotate instructions and to get interrupts more functional
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
255 context->int_ack_handler = int_ack_tmp;
5f725429d08f WIP changes to new CPU core for rotate instructions and to get interrupts more functional
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
256 int_ack_tmp = NULL;
1951
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
257 return context;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
258 }
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
259
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
260 void m68k_reset(m68k_context *context)
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
261 {
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
262 //read initial SP
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
263 context->scratch1 = 0;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
264 m68k_read_16(context);
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
265 context->aregs[7] = context->scratch1 << 16;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
266 context->scratch1 = 2;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
267 m68k_read_16(context);
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
268 context->aregs[7] |= context->scratch1;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
269
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
270 //read initial PC
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
271 context->scratch1 = 4;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
272 m68k_read_16(context);
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
273 context->pc = context->scratch1 << 16;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
274 context->scratch1 = 6;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
275 m68k_read_16(context);
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
276 context->pc |= context->scratch1;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
277
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
278 context->scratch1 = context->pc;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
279 m68k_read_16(context);
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
280 context->prefetch = context->scratch1;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
281 context->pc += 2;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
282
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
283 context->status = 0x27;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
284 }
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
285
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
286 void m68k_print_regs(m68k_context *context)
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
287 {
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
288 printf("XNZVC\n%d%d%d%d%d\n", context->xflag != 0, context->nflag != 0, context->zflag != 0, context->vflag != 0, context->cflag != 0);
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
289 for (int i = 0; i < 8; i++) {
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
290 printf("d%d: %X\n", i, context->dregs[i]);
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
291 }
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
292 for (int i = 0; i < 8; i++) {
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
293 printf("a%d: %X\n", i, context->aregs[i]);
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
294 }
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
295 }
2499
d74d3998482c Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2447
diff changeset
296
d74d3998482c Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2447
diff changeset
297 void m68k_serialize(m68k_context *context, uint32_t pc, serialize_buffer *buf)
d74d3998482c Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2447
diff changeset
298 {
2654
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
299 for (int i = 0; i < 8; i++)
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
300 {
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
301 save_int32(buf, context->dregs[i]);
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
302 }
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
303 for (int i = 0; i < 8; i++)
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
304 {
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
305 save_int32(buf, context->aregs[i]);
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
306 }
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
307 save_int32(buf, context->other_sp);
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
308 //old core saves the address of hte instruction that will execute upon resume
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
309 //in this field so we need to adjust PC here for compatibility
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
310 save_int32(buf, context->pc - 2);
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
311 uint16_t sr = context->status << 8;
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
312 if (context->xflag) { sr |= 0x10; }
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
313 if (context->nflag) { sr |= 0x08; }
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
314 if (context->zflag) { sr |= 0x04; }
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
315 if (context->vflag) { sr |= 0x02; }
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
316 if (context->cflag) { sr |= 0x1; }
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
317 save_int16(buf, sr);
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
318 save_int32(buf, context->cycles);
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
319 save_int32(buf, context->int_cycle);
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
320 save_int8(buf, context->int_priority); //int_num on old core, but it's the priority level
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
321 save_int8(buf, context->int_pending);
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
322 save_int8(buf, context->trace_pending);
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
323 //remaining fields have no equivalent in old core
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
324 save_int16(buf, context->prefetch);
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
325 save_int8(buf, context->stopped);
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
326 save_int8(buf, context->int_num);
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
327 save_int8(buf, context->int_pending_num);
2499
d74d3998482c Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2447
diff changeset
328 }
d74d3998482c Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2447
diff changeset
329
d74d3998482c Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2447
diff changeset
330 void m68k_deserialize(deserialize_buffer *buf, void *vcontext)
d74d3998482c Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2447
diff changeset
331 {
2654
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
332 m68k_context *context = vcontext;
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
333 for (int i = 0; i < 8; i++)
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
334 {
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
335 context->dregs[i] = load_int32(buf);
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
336 }
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
337 for (int i = 0; i < 8; i++)
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
338 {
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
339 context->aregs[i] = load_int32(buf);
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
340 }
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
341 context->other_sp = load_int32(buf);
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
342 context->pc = load_int32(buf);
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
343 uint16_t sr = load_int16(buf);
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
344 context->status = sr >> 8;
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
345 context->xflag = sr & 0x10;
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
346 context->nflag = sr & 0x08;
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
347 context->zflag = sr & 0x04;
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
348 context->vflag = sr & 0x02;
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
349 context->cflag = sr & 0x01;
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
350 context->cycles = load_int32(buf);
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
351 context->int_cycle = load_int32(buf);
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
352 context->int_priority = load_int8(buf); //int_num on old core, but it's the priority level
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
353 context->int_pending = load_int8(buf);
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
354 context->trace_pending = load_int8(buf);
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
355 if (buf->cur_pos < buf->size) {
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
356 context->prefetch = load_int16(buf);
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
357 context->stopped = load_int8(buf);
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
358 context->int_num = load_int8(buf);
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
359 context->int_pending_num = load_int8(buf);
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
360 } else {
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
361 context->prefetch = read_word(context->pc, (void**)context->mem_pointers, &context->opts->gen, context);
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
362 context->stopped = 0;
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
363 context->int_num = context->int_pending_num = 0;
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
364 }
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
365 //adjust for compatibility with old core
6068d32b756c Implement serialization for new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2651
diff changeset
366 context->pc += 2;
2499
d74d3998482c Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2447
diff changeset
367 }
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
368
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
369 void start_68k_context(m68k_context *context, uint32_t pc)
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
370 {
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
371 context->scratch1 = context->pc = pc;
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
372 m68k_read_16(context);
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
373 context->prefetch = context->scratch1;
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
374 context->pc += 2;
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
375 }
2676
7e86ec94c899 Implement breakpoints in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2666
diff changeset
376
7e86ec94c899 Implement breakpoints in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2666
diff changeset
377 void insert_breakpoint(m68k_context *context, uint32_t address, debug_handler handler)
7e86ec94c899 Implement breakpoints in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2666
diff changeset
378 {
7e86ec94c899 Implement breakpoints in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2666
diff changeset
379 char buf[6];
7e86ec94c899 Implement breakpoints in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2666
diff changeset
380 address &= context->opts->gen.address_mask;
7e86ec94c899 Implement breakpoints in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2666
diff changeset
381 context->breakpoints = tern_insert_ptr(context->breakpoints, tern_int_key(address, buf), handler);
7e86ec94c899 Implement breakpoints in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2666
diff changeset
382 }
7e86ec94c899 Implement breakpoints in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2666
diff changeset
383
7e86ec94c899 Implement breakpoints in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2666
diff changeset
384 void remove_breakpoint(m68k_context *context, uint32_t address)
7e86ec94c899 Implement breakpoints in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2666
diff changeset
385 {
7e86ec94c899 Implement breakpoints in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2666
diff changeset
386 char buf[6];
7e86ec94c899 Implement breakpoints in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2666
diff changeset
387 address &= context->opts->gen.address_mask;
7e86ec94c899 Implement breakpoints in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2666
diff changeset
388 tern_delete(&context->breakpoints, tern_int_key(address, buf), NULL);
7e86ec94c899 Implement breakpoints in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2666
diff changeset
389 }