1 #include "driver.h"
2 #include "vidhrdw/generic.h"
3 #include "vidhrdw/konamiic.h"
4 #include "cpu/konami/konami.h"
5 #include "machine/eeprom.h"
6 
7 /* from vidhrdw */
8 extern void simpsons_video_banking( int select );
9 extern unsigned char *simpsons_xtraram;
10 
11 int simpsons_firq_enabled;
12 
13 /***************************************************************************
14 
15   EEPROM
16 
17 ***************************************************************************/
18 
19 static int init_eeprom_count;
20 
21 
22 static struct EEPROM_interface eeprom_interface =
23 {
24 	7,				/* address bits */
25 	8,				/* data bits */
26 	"011000",		/*  read command */
27 	"011100",		/* write command */
28 	0,				/* erase command */
29 	"0100000000000",/* lock command */
30 	"0100110000000" /* unlock command */
31 };
32 
simpsons_nvram_handler(void * file,int read_or_write)33 void simpsons_nvram_handler(void *file,int read_or_write)
34 {
35 	if (read_or_write)
36 		EEPROM_save(file);
37 	else
38 	{
39 		EEPROM_init(&eeprom_interface);
40 
41 		if (file)
42 		{
43 			init_eeprom_count = 0;
44 			EEPROM_load(file);
45 		}
46 		else
47 			init_eeprom_count = 10;
48 	}
49 }
50 
READ_HANDLER(simpsons_eeprom_r)51 READ_HANDLER( simpsons_eeprom_r )
52 {
53 	int res;
54 
55 	res = (EEPROM_read_bit() << 4);
56 
57 	res |= 0x20;//konami_eeprom_ack() << 5; /* add the ack */
58 
59 	res |= readinputport( 5 ) & 1; /* test switch */
60 
61 	if (init_eeprom_count)
62 	{
63 		init_eeprom_count--;
64 		res &= 0xfe;
65 	}
66 	return res;
67 }
68 
WRITE_HANDLER(simpsons_eeprom_w)69 WRITE_HANDLER( simpsons_eeprom_w )
70 {
71 	if ( data == 0xff )
72 		return;
73 
74 	EEPROM_write_bit(data & 0x80);
75 	EEPROM_set_cs_line((data & 0x08) ? CLEAR_LINE : ASSERT_LINE);
76 	EEPROM_set_clock_line((data & 0x10) ? ASSERT_LINE : CLEAR_LINE);
77 
78 	simpsons_video_banking( data & 3 );
79 
80 	simpsons_firq_enabled = data & 0x04;
81 }
82 
83 /***************************************************************************
84 
85   Coin Counters, Sound Interface
86 
87 ***************************************************************************/
88 
WRITE_HANDLER(simpsons_coin_counter_w)89 WRITE_HANDLER( simpsons_coin_counter_w )
90 {
91 	/* bit 0,1 coin counters */
92 	coin_counter_w(0,data & 0x01);
93 	coin_counter_w(1,data & 0x02);
94 	/* bit 2 selects mono or stereo sound */
95 	/* bit 3 = enable char ROM reading through the video RAM */
96 	K052109_set_RMRD_line((data & 0x08) ? ASSERT_LINE : CLEAR_LINE);
97 	/* bit 4 = INIT (unknown) */
98 	/* bit 5 = enable sprite ROM reading */
99 	K053246_set_OBJCHA_line((~data & 0x20) ? ASSERT_LINE : CLEAR_LINE);
100 }
101 
READ_HANDLER(simpsons_sound_interrupt_r)102 READ_HANDLER( simpsons_sound_interrupt_r )
103 {
104 	cpu_cause_interrupt( 1, 0xff );
105 	return 0x00;
106 }
107 
READ_HANDLER(simpsons_sound_r)108 READ_HANDLER( simpsons_sound_r )
109 {
110 	/* If the sound CPU is running, read the status, otherwise
111 	   just make it pass the test */
112 	if (Machine->sample_rate != 0) 	return K053260_r(2 + offset);
113 	else
114 	{
115 		static int res = 0x80;
116 
117 		res = (res & 0xfc) | ((res + 1) & 0x03);
118 		return offset ? res : 0x00;
119 	}
120 }
121 
122 /***************************************************************************
123 
124   Speed up memory handlers
125 
126 ***************************************************************************/
127 
READ_HANDLER(simpsons_speedup1_r)128 READ_HANDLER( simpsons_speedup1_r )
129 {
130 	unsigned char *RAM = memory_region(REGION_CPU1);
131 
132 	int data1 = RAM[0x486a];
133 
134 	if ( data1 == 0 )
135 	{
136 		int data2 = ( RAM[0x4942] << 8 ) | RAM[0x4943];
137 
138 		if ( data2 < memory_region_length(REGION_CPU1) )
139 		{
140 			data2 = ( RAM[data2] << 8 ) | RAM[data2 + 1];
141 
142 			if ( data2 == 0xffff )
143 				cpu_spinuntil_int();
144 
145 			return RAM[0x4942];
146 		}
147 
148 		return RAM[0x4942];
149 	}
150 
151 	if ( data1 == 1 )
152 		RAM[0x486a]--;
153 
154 	return RAM[0x4942];
155 }
156 
READ_HANDLER(simpsons_speedup2_r)157 READ_HANDLER( simpsons_speedup2_r )
158 {
159 	int data = memory_region(REGION_CPU1)[0x4856];
160 
161 	if ( data == 1 )
162 		cpu_spinuntil_int();
163 
164 	return data;
165 }
166 
167 /***************************************************************************
168 
169   Banking, initialization
170 
171 ***************************************************************************/
172 
simpsons_banking(int lines)173 static void simpsons_banking( int lines )
174 {
175 	unsigned char *RAM = memory_region(REGION_CPU1);
176 	int offs = 0;
177 
178 	switch ( lines & 0xf0 )
179 	{
180 		case 0x00: /* simp_g02.rom */
181 			offs = 0x10000 + ( ( lines & 0x0f ) * 0x2000 );
182 		break;
183 
184 		case 0x10: /* simp_p01.rom */
185 			offs = 0x30000 + ( ( lines & 0x0f ) * 0x2000 );
186 		break;
187 
188 		case 0x20: /* simp_013.rom */
189 			offs = 0x50000 + ( ( lines & 0x0f ) * 0x2000 );
190 		break;
191 
192 		case 0x30: /* simp_012.rom ( lines goes from 0x00 to 0x0c ) */
193 			offs = 0x70000 + ( ( lines & 0x0f ) * 0x2000 );
194 		break;
195 
196 		default:
197 			//logerror("PC = %04x : Unknown bank selected (%02x)\n", cpu_get_pc(), lines );
198 		break;
199 	}
200 
201 	cpu_setbank( 1, &RAM[offs] );
202 }
203 
simpsons_init_machine(void)204 void simpsons_init_machine( void )
205 {
206 	unsigned char *RAM = memory_region(REGION_CPU1);
207 
208 	konami_cpu_setlines_callback = simpsons_banking;
209 
210 	paletteram = &RAM[0x88000];
211 	simpsons_xtraram = &RAM[0x89000];
212 	simpsons_firq_enabled = 0;
213 
214 	/* init the default banks */
215 	cpu_setbank( 1, &RAM[0x10000] );
216 
217 	RAM = memory_region(REGION_CPU2);
218 
219 	cpu_setbank( 2, &RAM[0x10000] );
220 
221 	simpsons_video_banking( 0 );
222 }
223