Mercurial > repos > blastem
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 |
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 } |