Previous 199869 Revisions Next

r19042 Monday 19th November, 2012 at 13:21:52 UTC by hap
improve external memory handling (firebeat still needs that hack tho)
[src/emu/sound]ymz280b.c

trunk/src/emu/sound/ymz280b.c
r19041r19042
8585   UINT8 irq_mask;               /* current IRQ mask */
8686   UINT8 irq_enable;            /* current IRQ enable */
8787   UINT8 keyon_enable;            /* key on enable */
88   UINT8 ext_mem_enable;         /* external memory enable */
8889   double master_clock;         /* master clock frequency */
8990   void (*irq_callback)(device_t *, int);   /* IRQ callback */
9091   struct YMZ280BVoice   voice[8];   /* the 8 voices */
92   UINT32 rom_addr_hi;
93   UINT32 rom_addr_mid;
9194   UINT32 rom_readback_addr;      /* where the CPU can read the ROM */
9295   devcb_resolved_read8 ext_ram_read;      /* external RAM read handler */
9396   devcb_resolved_write8 ext_ram_write;   /* external RAM write handler */
r19041r19042
711714      device->save_item(NAME(chip->irq_mask));
712715      device->save_item(NAME(chip->irq_enable));
713716      device->save_item(NAME(chip->keyon_enable));
717      device->save_item(NAME(chip->ext_mem_enable));
714718      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));
715721      for (j = 0; j < 8; j++)
716722      {
717723         device->save_item(NAME(chip->voice[j].playing), j);
r19041r19042
761767
762768   chip->current_register = 0;
763769   chip->status_register = 0;
770   chip->rom_readback_addr = 0;
764771
765772   /* clear other voice parameters */
766773   for (i = 0; i < 8; i++)
r19041r19042
903910            break;
904911
905912         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;
908914            break;
909915
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;
913918            break;
914919
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;
918922            break;
919923
920924         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            }
926933            break;
927934
928935         case 0xfe:      /* IRQ mask */
r19041r19042
931938            break;
932939
933940         case 0xff:      /* IRQ enable, test, etc */
941            chip->ext_mem_enable = (data & 0x40) >> 6;
934942            chip->irq_enable = (data & 0x10) >> 4;
935943            update_irq_state(chip);
936944
r19041r19042
974982{
975983   UINT8 result;
976984
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
985985   /* force an update */
986986   chip->stream->update();
987987
r19041r19042
10081008
10091009   if ((offset & 1) == 0)
10101010   {
1011      if (!chip->ext_mem_enable)
1012         return 0xff;
1013
10111014      /* read from external memory */
10121015      UINT8 result;
10131016      if (!chip->ext_ram_read.isnull())

Previous 199869 Revisions Next


© 1997-2024 The MAME Team