Mercurial > repos > blastem
comparison upd78k2_util.c @ 2705:ab2d916380bf
WIP uPD78K/II CPU core
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 06 Jul 2025 15:20:46 -0700 |
parents | |
children | 0bd48217941a |
comparison
equal
deleted
inserted
replaced
2704:c5dce4284e69 | 2705:ab2d916380bf |
---|---|
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; | |
31 default: | |
32 fprintf(stderr, "Unhandled uPD78237 SFR read %02X\n", address); | |
33 return 0xFF; | |
34 } | |
35 } | |
36 | |
37 void *upd78237_sfr_write(uint32_t address, void *context, uint8_t value) | |
38 { | |
39 upd78k2_context *upd = context; | |
40 if (address < 8 && address != 2 && address != 7) { | |
41 upd->port_data[address] = value; | |
42 } else { | |
43 switch (address) | |
44 { | |
45 case 0x20: | |
46 case 0x23: | |
47 case 0x25: | |
48 case 0x26: | |
49 upd->port_mode[address & 7] = value; | |
50 break; | |
51 case 0xC4: | |
52 upd->mm = value; | |
53 break; | |
54 default: | |
55 fprintf(stderr, "Unhandled uPD78237 SFR write %02X: %02X\n", address, value); | |
56 break; | |
57 } | |
58 } | |
59 return context; | |
60 } | |
61 | |
62 void init_upd78k2_opts(upd78k2_options *opts, memmap_chunk const *chunks, uint32_t num_chunks) | |
63 { | |
64 memset(opts, 0, sizeof(*opts)); | |
65 opts->gen.memmap = chunks; | |
66 opts->gen.memmap_chunks = num_chunks; | |
67 opts->gen.address_mask = 0xFFFFF; | |
68 opts->gen.max_address = 0xFFFFF; | |
69 } | |
70 | |
71 upd78k2_context *init_upd78k2_context(upd78k2_options *opts) | |
72 { | |
73 upd78k2_context *context = calloc(1, sizeof(upd78k2_context)); | |
74 context->opts = opts; | |
75 return context; | |
76 } | |
77 |