|
|
1.1 root 1: /*****************************************************************************/
2: /* Generator - Sega Genesis emulation - (c) James Ponder 1997-1998 */
3: /*****************************************************************************/
4: /* */
5: /* z80.c */
6: /* */
7: /*****************************************************************************/
8:
9: #include <stdlib.h>
10: #include <stdio.h>
11: #include <string.h>
12:
13: #include <generator.h>
14: #include <cpuz80.h>
15: #include <cpu68k.h>
16: #include <memz80.h>
17: #include <ui.h>
18:
19: #include <z80/z80.h>
20:
21: /*** variables externed ***/
22:
23: uint8 *cpuz80_ram = NULL;
24: uint32 cpuz80_bank = 0;
25: unsigned int cpuz80_active = 0;
26:
27: /*** global variables ***/
28:
29: static unsigned int cpuz80_lastsync = 0;
30: static unsigned int cpuz80_resetting = 0;
31:
32: /*** cpuz80_init - initialise this sub-unit ***/
33:
34: int cpuz80_init(void)
35: {
36: cpuz80_reset();
37: ui_log(LOG_CRITICAL, "z80 init");
38: return 0;
39: }
40:
41: /*** cpuz80_callback - callback ***/
42:
43: int cpuz80_callback(int val) {
44: (void)val;
45: return 0;
46: }
47:
48: /*** cpuz80_reset - reset z80 sub-unit ***/
49:
50: void cpuz80_reset(void)
51: {
52: if (!cpuz80_ram) {
53: if ((cpuz80_ram = malloc(LEN_SRAM)) == NULL) {
54: fprintf(stderr, "Out of memory\n");
55: exit(1);
56: }
57: }
58: memset(cpuz80_ram, 0, LEN_SRAM);
59: cpuz80_resetcpu();
60: cpuz80_bank = 0;
61: cpuz80_active = 0;
62: cpuz80_lastsync = 0;
63: cpuz80_resetting = 0;
64: z80_reset(NULL);
65: z80_set_irq_callback(cpuz80_callback);
66: }
67:
68: /*** cpuz80_resetcpu - reset z80 cpu ***/
69:
70: void cpuz80_resetcpu(void)
71: {
72: z80_reset(NULL);
73: z80_set_irq_callback(cpuz80_callback);
74: cpuz80_resetting = 1; /* suspends execution */
75: }
76:
77: /*** cpuz80_unresetcpu - unreset z80 cpu ***/
78:
79: void cpuz80_unresetcpu(void)
80: {
81: cpuz80_resetting = 0; /* un-suspends execution */
82: }
83:
84: /*** cpuz80_bankwrite - data is being written to latch ***/
85:
86: void cpuz80_bankwrite(uint8 data)
87: {
88: cpuz80_bank = (((cpuz80_bank >> 1) | ((data & 1) <<23)) & 0xff8000);
89: /*
90: if (gen_debug)
91: printf("BANK WRITE: %d --> %08X\n", data, cpuz80_bank);
92: */
93: }
94:
95: /*** cpuz80_stop - stop the processor ***/
96:
97: void cpuz80_stop(void)
98: {
99: cpuz80_sync();
100: cpuz80_active = 0;
101: }
102:
103: /*** cpuz80_start - start the processor ***/
104:
105: void cpuz80_start(void)
106: {
107: cpuz80_sync();
108: cpuz80_active = 1;
109: }
110:
111: /*** cpuz80_endfield - reset counters ***/
112:
113: void cpuz80_endfield(void)
114: {
115: cpuz80_lastsync = 0;
116: }
117:
118: /*** cpuz80_sync - synchronise ***/
119:
120: void cpuz80_sync(void)
121: {
122: int cpu68k_wanted = cpu68k_clocks - cpuz80_lastsync;
123: int wanted = (cpu68k_wanted<0?0:cpu68k_wanted)*7/16;
124: int acheived;
125:
126: if (cpuz80_active && !cpuz80_resetting)
127: acheived = z80_execute(wanted);
128: cpuz80_lastsync = cpu68k_clocks;
129: }
130:
131: /*** cpuz80_interrupt - cause an interrupt on the z80 */
132:
133: void cpuz80_interrupt(void)
134: {
135: if (!cpuz80_resetting)
136: z80_set_irq_line(0, 1);
137: }
138:
139: /*** cpuz80_portread - port read from z80 */
140:
141: uint8 cpuz80_portread(uint8 port)
142: {
143: printf("[Z80] Port read to %X\n", port);
144: return 0;
145: }
146:
147: /*** cpuz80_portwrite - z80 write to port */
148:
149: void cpuz80_portwrite(uint8 port, uint8 value)
150: {
151: printf("[Z80] Port write to %X of %X\n", port, value);
152: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.