annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2705
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1 #include <string.h>
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
2
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
3 void upd78k2_read_8(upd78k2_context *upd)
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
4 {
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
5 uint32_t tmp = upd->scratch1;
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
6 upd->scratch1 = read_byte(upd->scratch1, (void **)upd->mem_pointers, &upd->opts->gen, upd);
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
7 if (tmp == upd->pc) {
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
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,
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
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);
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
10 }
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
11 }
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
12
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
13 void upd78k2_write_8(upd78k2_context *upd)
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
14 {
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
15 write_byte(upd->scratch2, upd->scratch1, (void **)upd->mem_pointers, &upd->opts->gen, upd);
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
16 }
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
17
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
18 uint8_t upd78237_sfr_read(uint32_t address, void *context)
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
19 {
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
20 upd78k2_context *upd = context;
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
21 if (address < 8) {
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
22 return upd->port_data[address];
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
23 }
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
24 switch (address)
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
25 {
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
26 case 0x21:
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
27 case 0x26:
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
28 return upd->port_mode[address & 0x7];
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
29 case 0xC4:
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
30 return upd->mm;
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
31 default:
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
32 fprintf(stderr, "Unhandled uPD78237 SFR read %02X\n", address);
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
33 return 0xFF;
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
34 }
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
35 }
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
36
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
37 void *upd78237_sfr_write(uint32_t address, void *context, uint8_t value)
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
38 {
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
39 upd78k2_context *upd = context;
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
40 if (address < 8 && address != 2 && address != 7) {
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
41 upd->port_data[address] = value;
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
42 } else {
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
43 switch (address)
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
44 {
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
45 case 0x20:
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
46 case 0x23:
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
47 case 0x25:
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
48 case 0x26:
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
49 upd->port_mode[address & 7] = value;
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
50 break;
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
51 case 0xC4:
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
52 upd->mm = value;
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
53 break;
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
54 default:
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
55 fprintf(stderr, "Unhandled uPD78237 SFR write %02X: %02X\n", address, value);
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
56 break;
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
57 }
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
58 }
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
59 return context;
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
60 }
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
61
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
62 void init_upd78k2_opts(upd78k2_options *opts, memmap_chunk const *chunks, uint32_t num_chunks)
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
63 {
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
64 memset(opts, 0, sizeof(*opts));
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
65 opts->gen.memmap = chunks;
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
66 opts->gen.memmap_chunks = num_chunks;
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
67 opts->gen.address_mask = 0xFFFFF;
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
68 opts->gen.max_address = 0xFFFFF;
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
69 }
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
70
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
71 upd78k2_context *init_upd78k2_context(upd78k2_options *opts)
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
72 {
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
73 upd78k2_context *context = calloc(1, sizeof(upd78k2_context));
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
74 context->opts = opts;
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
75 return context;
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
76 }
ab2d916380bf WIP uPD78K/II CPU core
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
77