trunk/hash/msx1_cart.xml
| r248503 | r248504 | |
| 666 | 666 | </part> |
| 667 | 667 | </software> |
| 668 | 668 | |
| 669 | | <!-- Does not seem to work at the moment --> |
| 670 | | <software name="msxwritj" supported="no"> |
| 669 | <!-- Code seems to work but it does not display text --> |
| 670 | <software name="msxwritj" supported="partial"> |
| 671 | 671 | <description>Japanese MSX-Write (Jpn)</description> |
| 672 | 672 | <year>1986</year> |
| 673 | 673 | <publisher>ASCII</publisher> |
| 674 | 674 | <info name="alt_title" value="日本語MSX-Write" /> |
| 675 | 675 | <part name="cart" interface="msx_cart"> |
| 676 | 676 | <feature name="pcb" value="MSX WRITE 900178B" /> |
| 677 | | <feature name="slot" value="ascii8" /> |
| 677 | <feature name="slot" value="msxwrite" /> |
| 678 | 678 | <feature name="mapper" value="M60002-0125SP" /> |
| 679 | 679 | <dataarea name="rom" size="524288"> |
| 680 | 680 | <rom name="225 aa 8716 zoo" size="524288" crc="ef02e4f3" sha1="4180544158a57c99162269e33e4f2c77c9fce84e" offset="0" /> |
trunk/src/emu/bus/msx_cart/ascii.c
| r248503 | r248504 | |
| 8 | 8 | const device_type MSX_CART_ASCII16 = &device_creator<msx_cart_ascii16>; |
| 9 | 9 | const device_type MSX_CART_ASCII8_SRAM = &device_creator<msx_cart_ascii8_sram>; |
| 10 | 10 | const device_type MSX_CART_ASCII16_SRAM = &device_creator<msx_cart_ascii16_sram>; |
| 11 | const device_type MSX_CART_MSXWRITE = &device_creator<msx_cart_msxwrite>; |
| 11 | 12 | |
| 12 | 13 | |
| 13 | 14 | msx_cart_ascii8::msx_cart_ascii8(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| r248503 | r248504 | |
| 441 | 442 | } |
| 442 | 443 | } |
| 443 | 444 | } |
| 445 | |
| 446 | |
| 447 | |
| 448 | msx_cart_msxwrite::msx_cart_msxwrite(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 449 | : device_t(mconfig, MSX_CART_MSXWRITE, "MSX Cartridge - MSXWRITE", tag, owner, clock, "msx_cart_msxwrite", __FILE__) |
| 450 | , msx_cart_interface(mconfig, *this) |
| 451 | , m_bank_mask(0) |
| 452 | { |
| 453 | for (int i = 0; i < 2; i++) |
| 454 | { |
| 455 | m_selected_bank[i] = 0; |
| 456 | m_bank_base[i] = NULL; |
| 457 | } |
| 458 | } |
| 459 | |
| 460 | |
| 461 | void msx_cart_msxwrite::device_start() |
| 462 | { |
| 463 | save_item(NAME(m_selected_bank)); |
| 464 | |
| 465 | machine().save().register_postload(save_prepost_delegate(FUNC(msx_cart_msxwrite::restore_banks), this)); |
| 466 | } |
| 467 | |
| 468 | |
| 469 | void msx_cart_msxwrite::restore_banks() |
| 470 | { |
| 471 | for (int i = 0; i < 2; i++) |
| 472 | { |
| 473 | m_bank_base[i] = get_rom_base() + (m_selected_bank[i] & m_bank_mask) * 0x4000; |
| 474 | } |
| 475 | } |
| 476 | |
| 477 | |
| 478 | void msx_cart_msxwrite::device_reset() |
| 479 | { |
| 480 | for (int i = 0; i < 2; i++) |
| 481 | { |
| 482 | m_selected_bank[i] = 0; |
| 483 | } |
| 484 | } |
| 485 | |
| 486 | |
| 487 | void msx_cart_msxwrite::initialize_cartridge() |
| 488 | { |
| 489 | UINT32 size = get_rom_size(); |
| 490 | |
| 491 | if ( size > 256 * 0x4000 ) |
| 492 | { |
| 493 | fatalerror("msxwrite: ROM is too big\n"); |
| 494 | } |
| 495 | |
| 496 | UINT16 banks = size / 0x4000; |
| 497 | |
| 498 | if (size != banks * 0x4000 || (~(banks - 1) % banks)) |
| 499 | { |
| 500 | fatalerror("msxwrite: Invalid ROM size\n"); |
| 501 | } |
| 502 | |
| 503 | m_bank_mask = banks - 1; |
| 504 | |
| 505 | restore_banks(); |
| 506 | } |
| 507 | |
| 508 | |
| 509 | READ8_MEMBER(msx_cart_msxwrite::read_cart) |
| 510 | { |
| 511 | if ( offset >= 0x4000 && offset < 0xC000 ) |
| 512 | { |
| 513 | return m_bank_base[offset >> 15][offset & 0x3fff]; |
| 514 | } |
| 515 | return 0xff; |
| 516 | } |
| 517 | |
| 518 | |
| 519 | WRITE8_MEMBER(msx_cart_msxwrite::write_cart) |
| 520 | { |
| 521 | // The rom writes to 6fff and 7fff for banking, unknown whether |
| 522 | // other locations also trigger banking. |
| 523 | switch (offset) |
| 524 | { |
| 525 | case 0x6fff: |
| 526 | m_selected_bank[0] = data; |
| 527 | m_bank_base[0] = get_rom_base() + (m_selected_bank[0] & m_bank_mask) * 0x4000; |
| 528 | break; |
| 529 | |
| 530 | case 0x7fff: |
| 531 | m_selected_bank[1] = data; |
| 532 | m_bank_base[1] = get_rom_base() + (m_selected_bank[1] & m_bank_mask) * 0x4000; |
| 533 | break; |
| 534 | } |
| 535 | } |
| 536 | |
trunk/src/emu/bus/msx_cart/ascii.h
| r248503 | r248504 | |
| 10 | 10 | extern const device_type MSX_CART_ASCII16; |
| 11 | 11 | extern const device_type MSX_CART_ASCII8_SRAM; |
| 12 | 12 | extern const device_type MSX_CART_ASCII16_SRAM; |
| 13 | extern const device_type MSX_CART_MSXWRITE; |
| 13 | 14 | |
| 14 | 15 | |
| 15 | 16 | class msx_cart_ascii8 : public device_t |
| r248503 | r248504 | |
| 114 | 115 | }; |
| 115 | 116 | |
| 116 | 117 | |
| 118 | class msx_cart_msxwrite : public device_t |
| 119 | , public msx_cart_interface |
| 120 | { |
| 121 | public: |
| 122 | msx_cart_msxwrite(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 123 | |
| 124 | // device-level overrides |
| 125 | virtual void device_start(); |
| 126 | virtual void device_reset(); |
| 127 | |
| 128 | virtual void initialize_cartridge(); |
| 129 | |
| 130 | virtual DECLARE_READ8_MEMBER(read_cart); |
| 131 | virtual DECLARE_WRITE8_MEMBER(write_cart); |
| 132 | |
| 133 | void restore_banks(); |
| 134 | |
| 135 | private: |
| 136 | UINT8 m_bank_mask; |
| 137 | UINT8 m_selected_bank[2]; |
| 138 | UINT8 *m_bank_base[2]; |
| 139 | }; |
| 140 | |
| 117 | 141 | #endif |
trunk/src/emu/bus/msx_cart/cartridge.c
| r248503 | r248504 | |
| 45 | 45 | SLOT_INTERFACE_INTERNAL("korean_80in1", MSX_CART_KOREAN_80IN1) |
| 46 | 46 | SLOT_INTERFACE_INTERNAL("korean_90in1", MSX_CART_KOREAN_90IN1) |
| 47 | 47 | SLOT_INTERFACE_INTERNAL("korean_126in1", MSX_CART_KOREAN_126IN1) |
| 48 | SLOT_INTERFACE_INTERNAL("msxwrite", MSX_CART_MSXWRITE) |
| 48 | 49 | SLOT_INTERFACE_INTERNAL("sound_snatcher", MSX_CART_SOUND_SNATCHER) |
| 49 | 50 | SLOT_INTERFACE_INTERNAL("sound_sdsnatch", MSX_CART_SOUND_SDSNATCHER) |
| 50 | 51 | SLOT_INTERFACE_INTERNAL("msxaud_hxmu900", MSX_CART_MSX_AUDIO_HXMU900) |