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