Revision c2432a42 hw/sh7750.c

b/hw/sh7750.c
42 42
    uint32_t periph_freq;
43 43
    /* SDRAM controller */
44 44
    uint32_t bcr1;
45
    uint32_t bcr2;
45
    uint16_t bcr2;
46
    uint16_t bcr3;
47
    uint32_t bcr4;
46 48
    uint16_t rfcr;
49
    /* PCMCIA controller */
50
    uint16_t pcr;
47 51
    /* IO ports */
48 52
    uint16_t gpioic;
49 53
    uint32_t pctra;
......
66 70
    struct intc_desc intc;
67 71
} SH7750State;
68 72

  
69

  
73
static int inline has_bcr3_and_bcr4(SH7750State * s)
74
{
75
	return (s->cpu->features & SH_FEATURE_BCR3_AND_BCR4);
76
}
70 77
/**********************************************************************
71 78
 I/O ports
72 79
**********************************************************************/
......
211 218
    switch (addr) {
212 219
    case SH7750_BCR2_A7:
213 220
	return s->bcr2;
221
    case SH7750_BCR3_A7:
222
	if(!has_bcr3_and_bcr4(s))
223
	    error_access("word read", addr);
224
	return s->bcr3;
214 225
    case SH7750_FRQCR_A7:
215 226
	return 0;
227
    case SH7750_PCR_A7:
228
	return s->pcr;
216 229
    case SH7750_RFCR_A7:
217 230
	fprintf(stderr,
218 231
		"Read access to refresh count register, incrementing\n");
......
221 234
	return porta_lines(s);
222 235
    case SH7750_PDTRB_A7:
223 236
	return portb_lines(s);
237
    case SH7750_RTCOR_A7:
238
    case SH7750_RTCNT_A7:
239
    case SH7750_RTCSR_A7:
240
	ignore_access("word read", addr);
241
	return 0;
224 242
    default:
225 243
	error_access("word read", addr);
226 244
	assert(0);
......
235 253
    case SH7750_BCR1_A7:
236 254
	return s->bcr1;
237 255
    case SH7750_BCR4_A7:
256
	if(!has_bcr3_and_bcr4(s))
257
	    error_access("long read", addr);
258
	return s->bcr4;
238 259
    case SH7750_WCR1_A7:
239 260
    case SH7750_WCR2_A7:
240 261
    case SH7750_WCR3_A7:
......
271 292
    }
272 293
}
273 294

  
295
#define is_in_sdrmx(a, x) (a >= SH7750_SDMR ## x ## _A7 \
296
			&& a <= (SH7750_SDMR ## x ## _A7 + SH7750_SDMR ## x ## _REGNB))
274 297
static void sh7750_mem_writeb(void *opaque, target_phys_addr_t addr,
275 298
			      uint32_t mem_value)
276 299
{
277
    switch (addr) {
278
	/* PRECHARGE ? XXXXX */
279
    case SH7750_PRECHARGE0_A7:
280
    case SH7750_PRECHARGE1_A7:
300

  
301
    if (is_in_sdrmx(addr, 2) || is_in_sdrmx(addr, 3)) {
281 302
	ignore_access("byte write", addr);
282 303
	return;
283
    default:
284
	error_access("byte write", addr);
285
	assert(0);
286 304
    }
305

  
306
    error_access("byte write", addr);
307
    assert(0);
287 308
}
288 309

  
289 310
static void sh7750_mem_writew(void *opaque, target_phys_addr_t addr,
......
298 319
        s->bcr2 = mem_value;
299 320
        return;
300 321
    case SH7750_BCR3_A7:
301
    case SH7750_RTCOR_A7:
322
	if(!has_bcr3_and_bcr4(s))
323
	    error_access("word write", addr);
324
	s->bcr3 = mem_value;
325
	return;
326
    case SH7750_PCR_A7:
327
	s->pcr = mem_value;
328
	return;
302 329
    case SH7750_RTCNT_A7:
330
    case SH7750_RTCOR_A7:
303 331
    case SH7750_RTCSR_A7:
304 332
	ignore_access("word write", addr);
305 333
	return;
......
343 371
        s->bcr1 = mem_value;
344 372
        return;
345 373
    case SH7750_BCR4_A7:
374
	if(!has_bcr3_and_bcr4(s))
375
	    error_access("long write", addr);
376
	s->bcr4 = mem_value;
377
	return;
346 378
    case SH7750_WCR1_A7:
347 379
    case SH7750_WCR2_A7:
348 380
    case SH7750_WCR3_A7:

Also available in: Unified diff