trunk/src/mame/drivers/namcos10.c
| r22726 | r22727 | |
| 277 | 277 | m_maincpu(*this, "maincpu") { } |
| 278 | 278 | |
| 279 | 279 | // 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); |
| 283 | 283 | |
| 284 | 284 | // 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); |
| 294 | 293 | |
| 295 | 294 | UINT8 *nand_base; |
| 296 | 295 | void nand_copy( UINT32 *dst, UINT32 address, int len ); |
| r22726 | r22727 | |
| 300 | 299 | UINT8 cnt; |
| 301 | 300 | UINT32 bank_base; |
| 302 | 301 | UINT32 nand_address; |
| 303 | | UINT32 block[0x1ff]; |
| 302 | UINT16 block[0x1ff]; |
| 304 | 303 | |
| 305 | 304 | UINT16 nand_read( UINT32 address ); |
| 306 | 305 | UINT16 nand_read2( UINT32 address ); |
| r22726 | r22727 | |
| 338 | 337 | // bios copies 62000-37ffff from the flash to 80012000 in ram through the |
| 339 | 338 | // decryption in range_r then jumps there (and dies horribly, of course) |
| 340 | 339 | |
| 341 | | WRITE32_MEMBER(namcos10_state::key_w ) |
| 340 | WRITE16_MEMBER(namcos10_state::key_w ) |
| 342 | 341 | { |
| 343 | 342 | key = (data >> 15) | (data << 1); |
| 344 | 343 | logerror("key_w %04x\n", key); |
| 345 | 344 | cnt = 0; |
| 346 | 345 | } |
| 347 | 346 | |
| 348 | | WRITE32_MEMBER(namcos10_state::bank_w) |
| 347 | WRITE16_MEMBER(namcos10_state::bank_w) |
| 349 | 348 | { |
| 350 | | bank_base = 0x80000*(offset*2 + (ACCESSING_BITS_16_31 ? 1 : 0)); |
| 349 | bank_base = 0x80000 * offset; |
| 351 | 350 | } |
| 352 | 351 | |
| 353 | | READ32_MEMBER(namcos10_state::range_r) |
| 352 | READ16_MEMBER(namcos10_state::range_r) |
| 354 | 353 | { |
| 355 | | UINT32 data32 = ((const UINT32 *)(memregion("maincpu:rom")->base()))[offset+bank_base]; |
| 354 | UINT32 d16 = ((const UINT16 *)(memregion("maincpu:rom")->base()))[offset+bank_base]; |
| 356 | 355 | |
| 357 | | UINT16 d16; |
| 358 | | if(ACCESSING_BITS_16_31) |
| 359 | | d16 = data32 >> 16; |
| 360 | | else |
| 361 | | d16 = data32; |
| 362 | | |
| 363 | 356 | /* This is not entirely correct, but not entirely incorrect either... |
| 364 | 357 | It's also specific to mrdriller2, it seems. |
| 365 | 358 | */ |
| r22726 | r22727 | |
| 390 | 383 | |
| 391 | 384 | cnt++; |
| 392 | 385 | |
| 393 | | if(ACCESSING_BITS_16_31) |
| 394 | | return dd16 << 16; |
| 395 | | else |
| 396 | | return dd16; |
| 386 | return dd16; |
| 397 | 387 | } |
| 398 | 388 | |
| 399 | 389 | static 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) |
| 403 | 393 | |
| 404 | 394 | AM_IMPORT_FROM(namcos10_map) |
| 405 | 395 | ADDRESS_MAP_END |
| r22726 | r22727 | |
| 410 | 400 | // Block access to the nand. Something strange is going on with the |
| 411 | 401 | // status port. Interaction with the decryption is unclear at best. |
| 412 | 402 | |
| 413 | | READ32_MEMBER(namcos10_state::nand_status_r ) |
| 403 | READ16_MEMBER(namcos10_state::nand_status_r ) |
| 414 | 404 | { |
| 415 | 405 | return 0; |
| 416 | 406 | } |
| 417 | 407 | |
| 418 | | WRITE32_MEMBER(namcos10_state::nand_address1_w ) |
| 408 | WRITE8_MEMBER(namcos10_state::nand_address1_w ) |
| 419 | 409 | { |
| 420 | 410 | 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 ); |
| 422 | 412 | } |
| 423 | 413 | |
| 424 | | WRITE32_MEMBER(namcos10_state::nand_address2_w ) |
| 414 | WRITE8_MEMBER( namcos10_state::nand_address2_w ) |
| 425 | 415 | { |
| 426 | 416 | 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 ); |
| 428 | 418 | } |
| 429 | 419 | |
| 430 | | WRITE32_MEMBER(namcos10_state::nand_address3_w ) |
| 420 | WRITE8_MEMBER( namcos10_state::nand_address3_w ) |
| 431 | 421 | { |
| 432 | 422 | 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 ); |
| 434 | 424 | } |
| 435 | 425 | |
| 436 | | WRITE32_MEMBER(namcos10_state::nand_address4_w ) |
| 426 | WRITE8_MEMBER( namcos10_state::nand_address4_w ) |
| 437 | 427 | { |
| 438 | | nand_address = ( nand_address & 0xff00ffff ) | ( ( data & 0xff ) << 16 ); |
| 428 | nand_address = ( nand_address & 0xff00ffff ) | ( data << 16 ); |
| 439 | 429 | logerror("nand_a4_w %08x (%08x) -> %08x\n", data, space.device().safe_pc(), nand_address*2); |
| 440 | 430 | } |
| 441 | 431 | |
| r22726 | r22727 | |
| 451 | 441 | return nand_base[ index + 1 ] | ( nand_base[ index ] << 8 ); |
| 452 | 442 | } |
| 453 | 443 | |
| 454 | | READ32_MEMBER(namcos10_state::nand_data_r ) |
| 444 | READ16_MEMBER( namcos10_state::nand_data_r ) |
| 455 | 445 | { |
| 456 | | UINT32 data = nand_read2( nand_address * 2 ); |
| 446 | UINT16 data = nand_read2( nand_address * 2 ); |
| 457 | 447 | |
| 458 | 448 | // logerror("read %08x = %04x\n", nand_address*2, data); |
| 459 | 449 | |
| r22726 | r22727 | |
| 473 | 463 | } |
| 474 | 464 | } |
| 475 | 465 | |
| 476 | | WRITE32_MEMBER(namcos10_state::nand_block_w) |
| 466 | WRITE16_MEMBER(namcos10_state::nand_block_w) |
| 477 | 467 | { |
| 478 | 468 | COMBINE_DATA( &block[offset] ); |
| 479 | 469 | } |
| 480 | 470 | |
| 481 | | READ32_MEMBER(namcos10_state::nand_block_r) |
| 471 | READ16_MEMBER(namcos10_state::nand_block_r) |
| 482 | 472 | { |
| 483 | 473 | return block[ offset ]; |
| 484 | 474 | } |
| 485 | 475 | |
| 486 | | WRITE32_MEMBER(namcos10_state::watchdog_w) |
| 487 | | { |
| 488 | | } |
| 489 | | |
| 490 | 476 | static 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) |
| 492 | 478 | |
| 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) |
| 500 | 486 | |
| 501 | 487 | AM_IMPORT_FROM(namcos10_map) |
| 502 | 488 | ADDRESS_MAP_END |