trunk/src/emu/sound/ymz280b.c
| r19041 | r19042 | |
| 85 | 85 | UINT8 irq_mask; /* current IRQ mask */ |
| 86 | 86 | UINT8 irq_enable; /* current IRQ enable */ |
| 87 | 87 | UINT8 keyon_enable; /* key on enable */ |
| 88 | UINT8 ext_mem_enable; /* external memory enable */ |
| 88 | 89 | double master_clock; /* master clock frequency */ |
| 89 | 90 | void (*irq_callback)(device_t *, int); /* IRQ callback */ |
| 90 | 91 | struct YMZ280BVoice voice[8]; /* the 8 voices */ |
| 92 | UINT32 rom_addr_hi; |
| 93 | UINT32 rom_addr_mid; |
| 91 | 94 | UINT32 rom_readback_addr; /* where the CPU can read the ROM */ |
| 92 | 95 | devcb_resolved_read8 ext_ram_read; /* external RAM read handler */ |
| 93 | 96 | devcb_resolved_write8 ext_ram_write; /* external RAM write handler */ |
| r19041 | r19042 | |
| 711 | 714 | device->save_item(NAME(chip->irq_mask)); |
| 712 | 715 | device->save_item(NAME(chip->irq_enable)); |
| 713 | 716 | device->save_item(NAME(chip->keyon_enable)); |
| 717 | device->save_item(NAME(chip->ext_mem_enable)); |
| 714 | 718 | device->save_item(NAME(chip->rom_readback_addr)); |
| 719 | device->save_item(NAME(chip->rom_addr_hi)); |
| 720 | device->save_item(NAME(chip->rom_addr_mid)); |
| 715 | 721 | for (j = 0; j < 8; j++) |
| 716 | 722 | { |
| 717 | 723 | device->save_item(NAME(chip->voice[j].playing), j); |
| r19041 | r19042 | |
| 761 | 767 | |
| 762 | 768 | chip->current_register = 0; |
| 763 | 769 | chip->status_register = 0; |
| 770 | chip->rom_readback_addr = 0; |
| 764 | 771 | |
| 765 | 772 | /* clear other voice parameters */ |
| 766 | 773 | for (i = 0; i < 8; i++) |
| r19041 | r19042 | |
| 903 | 910 | break; |
| 904 | 911 | |
| 905 | 912 | case 0x84: /* ROM readback / RAM write (high) */ |
| 906 | | chip->rom_readback_addr &= 0xffff; |
| 907 | | chip->rom_readback_addr |= (data<<16); |
| 913 | chip->rom_addr_hi = data << 16; |
| 908 | 914 | break; |
| 909 | 915 | |
| 910 | | case 0x85: /* ROM readback / RAM write (med) */ |
| 911 | | chip->rom_readback_addr &= 0xff00ff; |
| 912 | | chip->rom_readback_addr |= (data<<8); |
| 916 | case 0x85: /* ROM readback / RAM write (middle) */ |
| 917 | chip->rom_addr_mid = data << 8; |
| 913 | 918 | break; |
| 914 | 919 | |
| 915 | | case 0x86: /* ROM readback / RAM write (low) */ |
| 916 | | chip->rom_readback_addr &= 0xffff00; |
| 917 | | chip->rom_readback_addr |= data; |
| 920 | case 0x86: /* ROM readback / RAM write (low) -> update latch */ |
| 921 | chip->rom_readback_addr = chip->rom_addr_hi | chip->rom_addr_mid | data; |
| 918 | 922 | break; |
| 919 | 923 | |
| 920 | 924 | case 0x87: /* RAM write */ |
| 921 | | if (!chip->ext_ram_write.isnull()) |
| 922 | | chip->ext_ram_write(chip->rom_readback_addr, data); |
| 923 | | else |
| 924 | | logerror("YMZ280B attempted RAM write to %X\n", chip->rom_readback_addr); |
| 925 | | chip->rom_readback_addr = (chip->rom_readback_addr + 1) & 0xffffff; |
| 925 | if (chip->ext_mem_enable) |
| 926 | { |
| 927 | if (!chip->ext_ram_write.isnull()) |
| 928 | chip->ext_ram_write(chip->rom_readback_addr, data); |
| 929 | else |
| 930 | logerror("YMZ280B attempted RAM write to %X\n", chip->rom_readback_addr); |
| 931 | chip->rom_readback_addr = (chip->rom_readback_addr + 1) & 0xffffff; |
| 932 | } |
| 926 | 933 | break; |
| 927 | 934 | |
| 928 | 935 | case 0xfe: /* IRQ mask */ |
| r19041 | r19042 | |
| 931 | 938 | break; |
| 932 | 939 | |
| 933 | 940 | case 0xff: /* IRQ enable, test, etc */ |
| 941 | chip->ext_mem_enable = (data & 0x40) >> 6; |
| 934 | 942 | chip->irq_enable = (data & 0x10) >> 4; |
| 935 | 943 | update_irq_state(chip); |
| 936 | 944 | |
| r19041 | r19042 | |
| 974 | 982 | { |
| 975 | 983 | UINT8 result; |
| 976 | 984 | |
| 977 | | /* ROM/RAM readback? */ |
| 978 | | if (chip->current_register == 0x86) |
| 979 | | { |
| 980 | | result = ymz280b_read_memory(chip->region_base, chip->region_size, chip->rom_readback_addr); |
| 981 | | chip->rom_readback_addr = (chip->rom_readback_addr + 1) & 0xffffff; |
| 982 | | return result; |
| 983 | | } |
| 984 | | |
| 985 | 985 | /* force an update */ |
| 986 | 986 | chip->stream->update(); |
| 987 | 987 | |
| r19041 | r19042 | |
| 1008 | 1008 | |
| 1009 | 1009 | if ((offset & 1) == 0) |
| 1010 | 1010 | { |
| 1011 | if (!chip->ext_mem_enable) |
| 1012 | return 0xff; |
| 1013 | |
| 1011 | 1014 | /* read from external memory */ |
| 1012 | 1015 | UINT8 result; |
| 1013 | 1016 | if (!chip->ext_ram_read.isnull()) |