annotate m68k_util.c @ 2587:e04c7e753bf6

Implement divs and divu in new CPU core
author Michael Pavone <pavone@retrodev.com>
date Sat, 08 Feb 2025 20:04:18 -0800
parents 939b818df589
children e602dbf776d8
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>
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
2
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
3 void m68k_read_8(m68k_context *context)
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
4 {
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
5 context->cycles += 4 * context->opts->gen.clock_divider;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
6 context->scratch1 = read_byte(context->scratch1, context->mem_pointers, &context->opts->gen, 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
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
9 void m68k_read_16(m68k_context *context)
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
10 {
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
11 context->cycles += 4 * context->opts->gen.clock_divider;
2587
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
12 uint32_t tmp = context->scratch1;
1951
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
13 context->scratch1 = read_word(context->scratch1, context->mem_pointers, &context->opts->gen, context);
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
14 }
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
15
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
16 void m68k_write_8(m68k_context *context)
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
17 {
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
18 context->cycles += 4 * context->opts->gen.clock_divider;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
19 write_byte(context->scratch2, context->scratch1, context->mem_pointers, &context->opts->gen, context);
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
20 }
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
21
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
22 void m68k_write_16(m68k_context *context)
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
23 {
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
24 context->cycles += 4 * context->opts->gen.clock_divider;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
25 write_word(context->scratch2, context->scratch1, context->mem_pointers, &context->opts->gen, context);
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
26 }
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 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
29 {
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
30 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
31 context->sync_components(context, 0);
1951
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
32 }
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
33
2587
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
34 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
35 {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
36 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
37 uint32_t divisor_shift = divisor << 16;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
38 uint16_t quotient = 0;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
39 uint8_t force = 0;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
40 uint16_t bit = 0;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
41 uint32_t cycles = 2;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
42 if (divisor_shift < dividend) {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
43 context->nflag = 128;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
44 context->zflag = 0;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
45 context->vflag = 128;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
46 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
47 return;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
48 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
49 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
50 {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
51 force = dividend >> 31;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
52 quotient = quotient << 1 | bit;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
53 dividend = dividend << 1;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
54
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
55 if (force || dividend >= divisor_shift) {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
56 dividend -= divisor_shift;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
57 cycles += force ? 4 : 6;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
58 bit = 1;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
59 } else {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
60 bit = 0;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
61 cycles += 8;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
62 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
63 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
64 cycles += force ? 6 : bit ? 4 : 2;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
65 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
66 quotient = quotient << 1 | bit;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
67 context->dregs[dividend_reg] = dividend | quotient;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
68 context->vflag = 0;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
69 context->nflag = quotient >> 8 & 128;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
70 context->zflag = quotient == 0;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
71 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
72
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
73 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
74 {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
75 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
76 uint32_t divisor_shift = divisor << 16;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
77 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
78 if (divisor_shift & 0x80000000) {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
79 divisor_shift = 0 - divisor_shift;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
80 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
81
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
82 uint32_t cycles = 8;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
83 if (dividend & 0x80000000) {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
84 //dvs10
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
85 dividend = 0 - dividend;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
86 cycles += 2;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
87 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
88 if (divisor_shift <= dividend) {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
89 context->vflag = 128;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
90 context->nflag = 128;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
91 context->zflag = 0;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
92 cycles += 4;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
93 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
94 return;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
95 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
96 uint16_t quotient = 0;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
97 uint16_t bit = 0;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
98 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
99 {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
100 quotient = quotient << 1 | bit;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
101 dividend = dividend << 1;
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 if (dividend >= divisor_shift) {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
104 dividend -= divisor_shift;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
105 cycles += 6;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
106 bit = 1;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
107 } else {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
108 bit = 0;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
109 cycles += 8;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
110 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
111 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
112 quotient = quotient << 1 | bit;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
113 dividend = dividend << 1;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
114 if (dividend >= divisor_shift) {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
115 dividend -= divisor_shift;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
116 quotient = quotient << 1 | 1;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
117 } else {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
118 quotient = quotient << 1;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
119 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
120 cycles += 4;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
121
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 if (orig_divisor & 0x80000000) {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
124 cycles += 16; //was 10
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
125 if (orig_dividend & 0x80000000) {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
126 if (quotient & 0x8000) {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
127 context->vflag = 128;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
128 context->nflag = 128;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
129 context->zflag = 0;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
130 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
131 return;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
132 } else {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
133 dividend = -dividend;
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 } else {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
136 quotient = -quotient;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
137 if (quotient && !(quotient & 0x8000)) {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
138 context->vflag = 128;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
139 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
140 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
141 } else if (orig_dividend & 0x80000000) {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
142 cycles += 18; // was 12
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
143 quotient = -quotient;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
144 if (quotient && !(quotient & 0x8000)) {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
145 context->vflag = 128;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
146 } else {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
147 dividend = -dividend;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
148 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
149 } else {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
150 cycles += 14; //was 10
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
151 if (quotient & 0x8000) {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
152 context->vflag= 128;
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 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
155 if (context->vflag) {
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
156 context->nflag = 128;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
157 context->zflag = 0;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
158 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
159 return;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
160 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
161 context->nflag = (quotient & 0x8000) ? 128 : 0;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
162 context->zflag = quotient == 0;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
163 //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
164 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
165 context->dregs[dividend_reg] = dividend | quotient;
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
166 }
e04c7e753bf6 Implement divs and divu in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2580
diff changeset
167
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
168 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
169 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
170 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
171 {
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
172 memset(opts, 0, sizeof(*opts));
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
173 opts->gen.memmap = memmap;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
174 opts->gen.memmap_chunks = num_chunks;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
175 opts->gen.address_mask = 0xFFFFFF;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
176 opts->gen.byte_swap = 1;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
177 opts->gen.max_address = 0x1000000;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
178 opts->gen.bus_cycles = 4;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
179 opts->gen.clock_divider = clock_divider;
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
180 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
181 int_ack_tmp = int_ack;
1951
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
182 }
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
183
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
184 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
185 {
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
186 m68k_context *context = calloc(1, sizeof(m68k_context));
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
187 context->opts = opts;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
188 context->reset_handler = reset_handler;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
189 context->int_cycle = 0xFFFFFFFFU;
2580
939b818df589 Get 68K interrupts working in new CPU core
Michael Pavone <pavone@retrodev.com>
parents: 2577
diff changeset
190 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
191 context->sync_components = 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
192 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
193 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
194 int_ack_tmp = NULL;
1951
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
195 return context;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
196 }
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
197
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
198 void m68k_reset(m68k_context *context)
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
199 {
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
200 //read initial SP
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
201 context->scratch1 = 0;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
202 m68k_read_16(context);
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
203 context->aregs[7] = context->scratch1 << 16;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
204 context->scratch1 = 2;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
205 m68k_read_16(context);
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
206 context->aregs[7] |= context->scratch1;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
207
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
208 //read initial PC
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
209 context->scratch1 = 4;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
210 m68k_read_16(context);
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
211 context->pc = context->scratch1 << 16;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
212 context->scratch1 = 6;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
213 m68k_read_16(context);
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
214 context->pc |= context->scratch1;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
215
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
216 context->scratch1 = context->pc;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
217 m68k_read_16(context);
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
218 context->prefetch = context->scratch1;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
219 context->pc += 2;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
220
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
221 context->status = 0x27;
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
222 }
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
223
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
224 void m68k_print_regs(m68k_context *context)
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 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
227 for (int i = 0; i < 8; i++) {
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
228 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
229 }
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
230 for (int i = 0; i < 8; i++) {
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
231 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
232 }
8494fe8d6b65 Add missing file from new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
233 }
2499
d74d3998482c Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2447
diff changeset
234
d74d3998482c Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2447
diff changeset
235 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
236 {
d74d3998482c Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2447
diff changeset
237 //TODO: implement me
d74d3998482c Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2447
diff changeset
238 }
d74d3998482c Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2447
diff changeset
239
d74d3998482c Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2447
diff changeset
240 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
241 {
d74d3998482c Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2447
diff changeset
242 //TODO: implement me
d74d3998482c Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2447
diff changeset
243 }
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
244
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
245 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
246 {
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
247 context->scratch1 = context->pc = pc;
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
248 m68k_read_16(context);
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
249 context->prefetch = context->scratch1;
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
250 context->pc += 2;
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
251 }