Previous 199869 Revisions Next

r22727 Friday 10th May, 2013 at 10:28:09 UTC by smf
converted I/O to 16 bit (nw)
[src/mame/drivers]namcos10.c

trunk/src/mame/drivers/namcos10.c
r22726r22727
277277      m_maincpu(*this, "maincpu") { }
278278
279279   // memm variant interface
280   DECLARE_WRITE32_MEMBER(key_w);
281   DECLARE_READ32_MEMBER(range_r);
282   DECLARE_WRITE32_MEMBER(bank_w);
280   DECLARE_WRITE16_MEMBER(key_w);
281   DECLARE_READ16_MEMBER(range_r);
282   DECLARE_WRITE16_MEMBER(bank_w);
283283
284284   // memn variant interface
285   DECLARE_READ32_MEMBER (nand_status_r);
286   DECLARE_WRITE32_MEMBER(nand_address1_w);
287   DECLARE_WRITE32_MEMBER(nand_address2_w);
288   DECLARE_WRITE32_MEMBER(nand_address3_w);
289   DECLARE_WRITE32_MEMBER(nand_address4_w);
290   DECLARE_READ32_MEMBER (nand_data_r);
291   DECLARE_WRITE32_MEMBER(watchdog_w);
292   DECLARE_WRITE32_MEMBER(nand_block_w);
293   DECLARE_READ32_MEMBER (nand_block_r);
285   DECLARE_READ16_MEMBER (nand_status_r);
286   DECLARE_WRITE8_MEMBER(nand_address1_w);
287   DECLARE_WRITE8_MEMBER(nand_address2_w);
288   DECLARE_WRITE8_MEMBER(nand_address3_w);
289   DECLARE_WRITE8_MEMBER(nand_address4_w);
290   DECLARE_READ16_MEMBER(nand_data_r);
291   DECLARE_WRITE16_MEMBER(nand_block_w);
292   DECLARE_READ16_MEMBER(nand_block_r);
294293
295294   UINT8 *nand_base;
296295   void nand_copy( UINT32 *dst, UINT32 address, int len );
r22726r22727
300299   UINT8  cnt;
301300   UINT32 bank_base;
302301   UINT32 nand_address;
303   UINT32 block[0x1ff];
302   UINT16 block[0x1ff];
304303
305304   UINT16 nand_read( UINT32 address );
306305   UINT16 nand_read2( UINT32 address );
r22726r22727
338337// bios copies 62000-37ffff from the flash to 80012000 in ram through the
339338// decryption in range_r then jumps there (and dies horribly, of course)
340339
341WRITE32_MEMBER(namcos10_state::key_w )
340WRITE16_MEMBER(namcos10_state::key_w )
342341{
343342   key = (data >> 15) | (data << 1);
344343   logerror("key_w %04x\n", key);
345344   cnt = 0;
346345}
347346
348WRITE32_MEMBER(namcos10_state::bank_w)
347WRITE16_MEMBER(namcos10_state::bank_w)
349348{
350   bank_base = 0x80000*(offset*2 + (ACCESSING_BITS_16_31 ? 1 : 0));
349   bank_base = 0x80000 * offset;
351350}
352351
353READ32_MEMBER(namcos10_state::range_r)
352READ16_MEMBER(namcos10_state::range_r)
354353{
355   UINT32 data32 = ((const UINT32 *)(memregion("maincpu:rom")->base()))[offset+bank_base];
354   UINT32 d16 = ((const UINT16 *)(memregion("maincpu:rom")->base()))[offset+bank_base];
356355
357   UINT16 d16;
358   if(ACCESSING_BITS_16_31)
359      d16 = data32 >> 16;
360   else
361      d16 = data32;
362
363356   /* This is not entirely correct, but not entirely incorrect either...
364357      It's also specific to mrdriller2, it seems.
365358   */
r22726r22727
390383
391384   cnt++;
392385
393   if(ACCESSING_BITS_16_31)
394      return dd16 << 16;
395   else
396      return dd16;
386   return dd16;
397387}
398388
399389static ADDRESS_MAP_START( namcos10_memm_map, AS_PROGRAM, 32, namcos10_state )
400   AM_RANGE(0x1f300000, 0x1f300003) AM_WRITE(key_w)
401   AM_RANGE(0x1f400000, 0x1f5fffff) AM_READ (range_r)
402   AM_RANGE(0x1fb40000, 0x1fb4000f) AM_WRITE(bank_w)
390   AM_RANGE(0x1f300000, 0x1f300003) AM_WRITE16(key_w, 0x0000fffff)
391   AM_RANGE(0x1f400000, 0x1f5fffff) AM_READ16(range_r, 0xffffffff)
392   AM_RANGE(0x1fb40000, 0x1fb4000f) AM_WRITE16(bank_w, 0xffffffff)
403393
404394   AM_IMPORT_FROM(namcos10_map)
405395ADDRESS_MAP_END
r22726r22727
410400// Block access to the nand.  Something strange is going on with the
411401// status port.  Interaction with the decryption is unclear at best.
412402
413READ32_MEMBER(namcos10_state::nand_status_r )
403READ16_MEMBER(namcos10_state::nand_status_r )
414404{
415405   return 0;
416406}
417407
418WRITE32_MEMBER(namcos10_state::nand_address1_w )
408WRITE8_MEMBER(namcos10_state::nand_address1_w )
419409{
420410   logerror("nand_a1_w %08x (%08x)\n", data, space.device().safe_pc());
421   //  nand_address = ( nand_address & 0x00ffffff ) | ( ( data & 0xff ) << 24 );
411   //  nand_address = ( nand_address & 0x00ffffff ) | ( data << 24 );
422412}
423413
424WRITE32_MEMBER(namcos10_state::nand_address2_w )
414WRITE8_MEMBER( namcos10_state::nand_address2_w )
425415{
426416   logerror("nand_a2_w %08x (%08x)\n", data, space.device().safe_pc());
427   nand_address = ( nand_address & 0xffffff00 ) | ( ( data & 0xff ) << 0 );
417   nand_address = ( nand_address & 0xffffff00 ) | ( data << 0 );
428418}
429419
430WRITE32_MEMBER(namcos10_state::nand_address3_w )
420WRITE8_MEMBER( namcos10_state::nand_address3_w )
431421{
432422   logerror("nand_a3_w %08x (%08x)\n", data, space.device().safe_pc());
433   nand_address = ( nand_address & 0xffff00ff ) | ( ( data & 0xff ) <<  8 );
423   nand_address = ( nand_address & 0xffff00ff ) | ( data <<  8 );
434424}
435425
436WRITE32_MEMBER(namcos10_state::nand_address4_w )
426WRITE8_MEMBER( namcos10_state::nand_address4_w )
437427{
438   nand_address = ( nand_address & 0xff00ffff ) | ( ( data & 0xff ) << 16 );
428   nand_address = ( nand_address & 0xff00ffff ) | ( data << 16 );
439429   logerror("nand_a4_w %08x (%08x) -> %08x\n", data, space.device().safe_pc(), nand_address*2);
440430}
441431
r22726r22727
451441   return nand_base[ index + 1 ] | ( nand_base[ index ] << 8 );
452442}
453443
454READ32_MEMBER(namcos10_state::nand_data_r )
444READ16_MEMBER( namcos10_state::nand_data_r )
455445{
456   UINT32 data = nand_read2( nand_address * 2 );
446   UINT16 data = nand_read2( nand_address * 2 );
457447
458448   //  logerror("read %08x = %04x\n", nand_address*2, data);
459449
r22726r22727
473463   }
474464}
475465
476WRITE32_MEMBER(namcos10_state::nand_block_w)
466WRITE16_MEMBER(namcos10_state::nand_block_w)
477467{
478468   COMBINE_DATA( &block[offset] );
479469}
480470
481READ32_MEMBER(namcos10_state::nand_block_r)
471READ16_MEMBER(namcos10_state::nand_block_r)
482472{
483473   return block[ offset ];
484474}
485475
486WRITE32_MEMBER(namcos10_state::watchdog_w)
487{
488}
489
490476static ADDRESS_MAP_START( namcos10_memn_map, AS_PROGRAM, 32, namcos10_state )
491   AM_RANGE(0x1f300000, 0x1f300003) AM_WRITE(key_w)
477   AM_RANGE(0x1f300000, 0x1f300003) AM_WRITE16(key_w, 0x0000ffff)
492478
493   AM_RANGE(0x1f400000, 0x1f400003) AM_READ (nand_status_r)
494   AM_RANGE(0x1f410000, 0x1f410003) AM_WRITE(nand_address1_w)
495   AM_RANGE(0x1f420000, 0x1f420003) AM_WRITE(nand_address2_w)
496   AM_RANGE(0x1f430000, 0x1f430003) AM_WRITE(nand_address3_w)
497   AM_RANGE(0x1f440000, 0x1f440003) AM_WRITE(nand_address4_w)
498   AM_RANGE(0x1f450000, 0x1f450003) AM_READ (nand_data_r)
499   AM_RANGE(0x1fb60000, 0x1fb60003) AM_READWRITE(nand_block_r, nand_block_w)
479   AM_RANGE(0x1f400000, 0x1f400003) AM_READ16(nand_status_r, 0x0000ffff)
480   AM_RANGE(0x1f410000, 0x1f410003) AM_WRITE8(nand_address1_w, 0x000000ff)
481   AM_RANGE(0x1f420000, 0x1f420003) AM_WRITE8(nand_address2_w, 0x000000ff)
482   AM_RANGE(0x1f430000, 0x1f430003) AM_WRITE8(nand_address3_w, 0x000000ff)
483   AM_RANGE(0x1f440000, 0x1f440003) AM_WRITE8(nand_address4_w, 0x000000ff)
484   AM_RANGE(0x1f450000, 0x1f450003) AM_READ16(nand_data_r, 0x0000ffff)
485   AM_RANGE(0x1fb60000, 0x1fb60003) AM_READWRITE16(nand_block_r, nand_block_w, 0x0000ffff)
500486
501487   AM_IMPORT_FROM(namcos10_map)
502488ADDRESS_MAP_END

Previous 199869 Revisions Next


© 1997-2024 The MAME Team