Mercurial > repos > blastem
annotate upd78k2_util.c @ 2707:a64c0e1ed6ac
Implement speed control and reset for media player. Fix other bindings that could cause it to crash
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 06 Jul 2025 20:43:37 -0700 |
parents | 0bd48217941a |
children |
rev | line source |
---|---|
2705 | 1 #include <string.h> |
2 | |
3 void upd78k2_read_8(upd78k2_context *upd) | |
4 { | |
5 uint32_t tmp = upd->scratch1; | |
6 upd->scratch1 = read_byte(upd->scratch1, (void **)upd->mem_pointers, &upd->opts->gen, upd); | |
7 if (tmp == upd->pc) { | |
8 printf("uPD78K/II fetch %04X: %02X, AX=%02X%02X BC=%02X%02X DE=%02X%02X HL=%02X%02X SP=%04X\n", tmp, upd->scratch1, | |
9 upd->main[1], upd->main[0], upd->main[3], upd->main[2], upd->main[5], upd->main[4], upd->main[7], upd->main[6], upd->sp); | |
10 } | |
11 } | |
12 | |
13 void upd78k2_write_8(upd78k2_context *upd) | |
14 { | |
15 write_byte(upd->scratch2, upd->scratch1, (void **)upd->mem_pointers, &upd->opts->gen, upd); | |
16 } | |
17 | |
18 uint8_t upd78237_sfr_read(uint32_t address, void *context) | |
19 { | |
20 upd78k2_context *upd = context; | |
21 if (address < 8) { | |
22 return upd->port_data[address]; | |
23 } | |
24 switch (address) | |
25 { | |
26 case 0x21: | |
27 case 0x26: | |
28 return upd->port_mode[address & 0x7]; | |
29 case 0xC4: | |
30 return upd->mm; | |
2706
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
31 case 0xE0: |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
32 return upd->if0; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
33 case 0xE1: |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
34 return upd->if0 >> 8; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
35 case 0xE4: |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
36 return upd->mk0; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
37 case 0xE5: |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
38 return upd->mk0 >> 8; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
39 case 0xE8: |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
40 return upd->pr0; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
41 case 0xE9: |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
42 return upd->pr0 >> 8; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
43 case 0xEC: |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
44 return upd->ism0; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
45 case 0xED: |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
46 return upd->ism0 >> 8; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
47 case 0xF4: |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
48 return upd->intm0; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
49 case 0xF5: |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
50 return upd->intm1; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
51 case 0xF8: |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
52 return upd->ist; |
2705 | 53 default: |
54 fprintf(stderr, "Unhandled uPD78237 SFR read %02X\n", address); | |
55 return 0xFF; | |
56 } | |
57 } | |
58 | |
59 void *upd78237_sfr_write(uint32_t address, void *context, uint8_t value) | |
60 { | |
61 upd78k2_context *upd = context; | |
62 if (address < 8 && address != 2 && address != 7) { | |
63 upd->port_data[address] = value; | |
64 } else { | |
65 switch (address) | |
66 { | |
67 case 0x20: | |
68 case 0x23: | |
69 case 0x25: | |
70 case 0x26: | |
71 upd->port_mode[address & 7] = value; | |
72 break; | |
73 case 0xC4: | |
74 upd->mm = value; | |
75 break; | |
2706
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
76 case 0xE0: |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
77 upd->if0 &= 0xFF00; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
78 upd->if0 |= value; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
79 break; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
80 case 0xE1: |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
81 upd->if0 &= 0xFF; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
82 upd->if0 |= value << 8; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
83 break; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
84 case 0xE4: |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
85 upd->mk0 &= 0xFF00; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
86 upd->mk0 |= value; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
87 break; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
88 case 0xE5: |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
89 upd->mk0 &= 0xFF; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
90 upd->mk0 |= value << 8; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
91 break; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
92 case 0xE8: |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
93 upd->pr0 &= 0xFF00; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
94 upd->pr0 |= value; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
95 break; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
96 case 0xE9: |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
97 upd->pr0 &= 0xFF; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
98 upd->pr0 |= value << 8; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
99 break; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
100 case 0xEC: |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
101 upd->ism0 &= 0xFF00; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
102 upd->ism0 |= value; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
103 break; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
104 case 0xED: |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
105 upd->ism0 &= 0xFF; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
106 upd->ism0 |= value << 8; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
107 break; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
108 case 0xF4: |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
109 upd->intm0 = value; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
110 break; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
111 case 0xF5: |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
112 upd->intm1 = value; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
113 break; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
114 case 0xF8: |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
115 upd->ist = value; |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
116 break; |
2705 | 117 default: |
118 fprintf(stderr, "Unhandled uPD78237 SFR write %02X: %02X\n", address, value); | |
119 break; | |
120 } | |
121 } | |
122 return context; | |
123 } | |
124 | |
125 void init_upd78k2_opts(upd78k2_options *opts, memmap_chunk const *chunks, uint32_t num_chunks) | |
126 { | |
127 memset(opts, 0, sizeof(*opts)); | |
128 opts->gen.memmap = chunks; | |
129 opts->gen.memmap_chunks = num_chunks; | |
130 opts->gen.address_mask = 0xFFFFF; | |
131 opts->gen.max_address = 0xFFFFF; | |
132 } | |
133 | |
134 upd78k2_context *init_upd78k2_context(upd78k2_options *opts) | |
135 { | |
136 upd78k2_context *context = calloc(1, sizeof(upd78k2_context)); | |
137 context->opts = opts; | |
138 return context; | |
139 } | |
140 | |
2706
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
141 void upd78k2_sync_cycle(upd78k2_context *upd, uint32_t target_cycle) |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
142 { |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
143 //TODO: implement me |
0bd48217941a
Get uPD78K/II core done enough to run the LaserActive firmware main loop
Michael Pavone <pavone@retrodev.com>
parents:
2705
diff
changeset
|
144 } |