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;
|
|
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
|