Previous 199869 Revisions Next

r26365 Friday 22nd November, 2013 at 18:21:14 UTC by Osso
Moved some functions into driver class for vegas.c (nw)
[src/mame/drivers]vegas.c

trunk/src/mame/drivers/vegas.c
r26364r26365
313313
314314#define MAX_DYNAMIC_ADDRESSES   32
315315
316#define NOP_HANDLER         ((read32_space_func)-1)
316#define NOP_HANDLER         read32_delegate()
317317
318318
319319
r26364r26365
443443#define NINT_PCIE           (15)
444444
445445
446
447struct dynamic_address
446struct legacy_dynamic_address
448447{
449448   offs_t          start;
450449   offs_t          end;
r26364r26365
457456   const char *    wrname;
458457};
459458
459struct dynamic_address
460{
461   offs_t          start;
462   offs_t          end;
463   read32_delegate   read;
464   write32_delegate write;
465};
466
460467class vegas_state : public driver_device
461468{
462469public:
463470   vegas_state(const machine_config &mconfig, device_type type, const char *tag)
464471      : driver_device(mconfig, type, tag),
465         m_timekeeper(*this, "timekeeper") ,
472      m_maincpu(*this, "maincpu"),
473      m_timekeeper(*this, "timekeeper") ,
474      m_ide(*this, "ide"),
475      m_ethernet(*this, "ethernet"),
466476      m_rambase(*this, "rambase"),
467477      m_nile_regs(*this, "nile_regs"),
468      m_rombase(*this, "rombase"),
469      m_maincpu(*this, "maincpu") { }
478      m_rombase(*this, "rombase") { }
470479
480   required_device<cpu_device> m_maincpu;
471481   required_device<m48t37_device> m_timekeeper;
482   required_device<bus_master_ide_controller_device> m_ide;
483   required_device<smc91c94_device> m_ethernet;
472484   required_shared_ptr<UINT32> m_rambase;
473485   required_shared_ptr<UINT32> m_nile_regs;
474486   required_shared_ptr<UINT32> m_rombase;
r26364r26365
489501   device_t *m_voodoo;
490502   UINT8 m_dcs_idma_cs;
491503   int m_count;
504   int m_legacy_dynamic_count;
492505   int m_dynamic_count;
506   legacy_dynamic_address m_legacy_dynamic[MAX_DYNAMIC_ADDRESSES];
493507   dynamic_address m_dynamic[MAX_DYNAMIC_ADDRESSES];
494508   DECLARE_WRITE_LINE_MEMBER(ide_interrupt);
495509   DECLARE_WRITE_LINE_MEMBER(vblank_assert);
r26364r26365
511525   void remap_dynamic_addresses();
512526   void update_nile_irqs();
513527   void update_sio_irqs();
514   inline void _add_dynamic_address(offs_t start, offs_t end, read32_space_func read, write32_space_func write, const char *rdname, const char *wrname);
515   inline void _add_dynamic_device_address(device_t *device, offs_t start, offs_t end, read32_device_func read, write32_device_func write, const char *rdname, const char *wrname);
528   inline void _add_dynamic_address(offs_t start, offs_t end, read32_delegate read, write32_delegate write);
529   inline void _add_legacy_dynamic_address(offs_t start, offs_t end, read32_space_func read, write32_space_func write, const char *rdname, const char *wrname);
530   inline void _add_legacy_dynamic_device_address(device_t *device, offs_t start, offs_t end, read32_device_func read, write32_device_func write, const char *rdname, const char *wrname);
516531
517532   void init_common(int ioasic, int serialnum);
518   required_device<cpu_device> m_maincpu;
533   DECLARE_WRITE32_MEMBER( cmos_unlock_w );
534   DECLARE_WRITE32_MEMBER(timekeeper_w);
535   DECLARE_READ32_MEMBER(timekeeper_r);
536   DECLARE_READ32_MEMBER( pci_bridge_r );
537   DECLARE_WRITE32_MEMBER( pci_bridge_w );
538   DECLARE_READ32_MEMBER( pci_ide_r );
539   DECLARE_WRITE32_MEMBER( pci_ide_w );
540   DECLARE_READ32_MEMBER( pci_3dfx_r );
541   DECLARE_WRITE32_MEMBER( pci_3dfx_w );
542   DECLARE_READ32_MEMBER( nile_r );
543   DECLARE_WRITE32_MEMBER( nile_w );
544   DECLARE_READ32_MEMBER( sio_irq_clear_r );
545   DECLARE_WRITE32_MEMBER( sio_irq_clear_w );
546   DECLARE_READ32_MEMBER( sio_irq_enable_r );
547   DECLARE_WRITE32_MEMBER( sio_irq_enable_w );
548   DECLARE_READ32_MEMBER( sio_irq_cause_r );
549   DECLARE_READ32_MEMBER( sio_irq_status_r );
550   DECLARE_WRITE32_MEMBER( sio_led_w );
551   DECLARE_READ32_MEMBER( sio_led_r );
552   DECLARE_WRITE32_MEMBER( sio_w );
553   DECLARE_READ32_MEMBER( sio_r );
554   DECLARE_READ32_MEMBER( analog_port_r );
555   DECLARE_WRITE32_MEMBER( analog_port_w );
556   DECLARE_WRITE32_MEMBER( vegas_watchdog_w );
557   DECLARE_WRITE32_MEMBER( asic_fifo_w );
558   DECLARE_READ32_MEMBER( ide_main_r );
559   DECLARE_WRITE32_MEMBER( ide_main_w );
560   DECLARE_READ32_MEMBER( ide_alt_r );
561   DECLARE_WRITE32_MEMBER( ide_alt_w );
562   DECLARE_READ32_MEMBER( ide_bus_master32_r );
563   DECLARE_WRITE32_MEMBER( ide_bus_master32_w );
564   DECLARE_READ32_MEMBER( ethernet_r );
565   DECLARE_WRITE32_MEMBER( ethernet_w );
566   DECLARE_WRITE32_MEMBER( dcs3_fifo_full_w );
519567};
520568
521569
r26364r26365
607655 *
608656 *************************************/
609657
610static WRITE32_HANDLER( cmos_unlock_w )
658WRITE32_MEMBER( vegas_state::cmos_unlock_w )
611659{
612   vegas_state *state = space.machine().driver_data<vegas_state>();
613   state->m_cmos_unlocked = 1;
660   m_cmos_unlocked = 1;
614661}
615662
616663
617static WRITE32_HANDLER( timekeeper_w )
664WRITE32_MEMBER( vegas_state::timekeeper_w )
618665{
619   vegas_state *state = space.machine().driver_data<vegas_state>();
620   if (state->m_cmos_unlocked)
666   if (m_cmos_unlocked)
621667   {
622668      if ((mem_mask & 0x000000ff) != 0)
623         state->m_timekeeper->write(space, offset * 4 + 0, data >> 0, 0xff);
669         m_timekeeper->write(space, offset * 4 + 0, data >> 0, 0xff);
624670      if ((mem_mask & 0x0000ff00) != 0)
625         state->m_timekeeper->write(space, offset * 4 + 1, data >> 8, 0xff);
671         m_timekeeper->write(space, offset * 4 + 1, data >> 8, 0xff);
626672      if ((mem_mask & 0x00ff0000) != 0)
627         state->m_timekeeper->write(space, offset * 4 + 2, data >> 16, 0xff);
673         m_timekeeper->write(space, offset * 4 + 2, data >> 16, 0xff);
628674      if ((mem_mask & 0xff000000) != 0)
629         state->m_timekeeper->write(space, offset * 4 + 3, data >> 24, 0xff);
675         m_timekeeper->write(space, offset * 4 + 3, data >> 24, 0xff);
630676      if (offset*4 >= 0x7ff0)
631677         if (LOG_TIMEKEEPER) logerror("timekeeper_w(%04X & %08X) = %08X\n", offset*4, mem_mask, data);
632      state->m_cmos_unlocked = 0;
678      m_cmos_unlocked = 0;
633679   }
634680   else
635      logerror("%08X:timekeeper_w(%04X,%08X & %08X) without CMOS unlocked\n", space.device().safe_pc(), offset, data, mem_mask);
681      logerror("%08X:timekeeper_w(%04X,%08X & %08X) without CMOS unlocked\n", safe_pc(), offset, data, mem_mask);
636682}
637683
638684
639static READ32_HANDLER( timekeeper_r )
685READ32_MEMBER( vegas_state::timekeeper_r )
640686{
641   vegas_state *state = space.machine().driver_data<vegas_state>();
642687   UINT32 result = 0xffffffff;
643688   if ((mem_mask & 0x000000ff) != 0)
644      result = (result & ~0x000000ff) | (state->m_timekeeper->read(space, offset * 4 + 0, 0xff) << 0);
689      result = (result & ~0x000000ff) | (m_timekeeper->read(space, offset * 4 + 0, 0xff) << 0);
645690   if ((mem_mask & 0x0000ff00) != 0)
646      result = (result & ~0x0000ff00) | (state->m_timekeeper->read(space, offset * 4 + 1, 0xff) << 8);
691      result = (result & ~0x0000ff00) | (m_timekeeper->read(space, offset * 4 + 1, 0xff) << 8);
647692   if ((mem_mask & 0x00ff0000) != 0)
648      result = (result & ~0x00ff0000) | (state->m_timekeeper->read(space, offset * 4 + 2, 0xff) << 16);
693      result = (result & ~0x00ff0000) | (m_timekeeper->read(space, offset * 4 + 2, 0xff) << 16);
649694   if ((mem_mask & 0xff000000) != 0)
650      result = (result & ~0xff000000) | (state->m_timekeeper->read(space, offset * 4 + 3, 0xff) << 24);
695      result = (result & ~0xff000000) | (m_timekeeper->read(space, offset * 4 + 3, 0xff) << 24);
651696   if (offset*4 >= 0x7ff0)
652697      if (LOG_TIMEKEEPER) logerror("timekeeper_r(%04X & %08X) = %08X\n", offset*4, mem_mask, result);
653698   return result;
r26364r26365
661706 *
662707 *************************************/
663708
664static READ32_HANDLER( pci_bridge_r )
709READ32_MEMBER( vegas_state::pci_bridge_r )
665710{
666   vegas_state *state = space.machine().driver_data<vegas_state>();
667   UINT32 result = state->m_pci_bridge_regs[offset];
711   UINT32 result = m_pci_bridge_regs[offset];
668712
669713   switch (offset)
670714   {
r26364r26365
678722   }
679723
680724   if (LOG_PCI)
681      logerror("%06X:PCI bridge read: reg %d = %08X\n", space.device().safe_pc(), offset, result);
725      logerror("%06X:PCI bridge read: reg %d = %08X\n", safe_pc(), offset, result);
682726   return result;
683727}
684728
685729
686static WRITE32_HANDLER( pci_bridge_w )
730WRITE32_MEMBER( vegas_state::pci_bridge_w )
687731{
688   vegas_state *state = space.machine().driver_data<vegas_state>();
689   state->m_pci_bridge_regs[offset] = data;
732   m_pci_bridge_regs[offset] = data;
690733   if (LOG_PCI)
691      logerror("%06X:PCI bridge write: reg %d = %08X\n", space.device().safe_pc(), offset, data);
734      logerror("%06X:PCI bridge write: reg %d = %08X\n", safe_pc(), offset, data);
692735}
693736
694737
r26364r26365
699742 *
700743 *************************************/
701744
702static READ32_HANDLER( pci_ide_r )
745READ32_MEMBER( vegas_state::pci_ide_r )
703746{
704   vegas_state *state = space.machine().driver_data<vegas_state>();
705   UINT32 result = state->m_pci_ide_regs[offset];
747   UINT32 result = m_pci_ide_regs[offset];
706748
707749   switch (offset)
708750   {
r26364r26365
712754
713755      case 0x14:      /* interrupt pending */
714756         result &= 0xffffff00;
715         if (state->m_ide_irq_state)
757         if (m_ide_irq_state)
716758            result |= 4;
717759         break;
718760   }
719761
720762   if (LOG_PCI)
721      logerror("%06X:PCI IDE read: reg %d = %08X\n", space.device().safe_pc(), offset, result);
763      logerror("%06X:PCI IDE read: reg %d = %08X\n", safe_pc(), offset, result);
722764   return result;
723765}
724766
725767
726static WRITE32_HANDLER( pci_ide_w )
768WRITE32_MEMBER( vegas_state::pci_ide_w )
727769{
728   vegas_state *state = space.machine().driver_data<vegas_state>();
729   state->m_pci_ide_regs[offset] = data;
770   m_pci_ide_regs[offset] = data;
730771
731772   switch (offset)
732773   {
733774      case 0x04:      /* address register */
734         state->m_pci_ide_regs[offset] &= 0xfffffff0;
735         state->remap_dynamic_addresses();
775         m_pci_ide_regs[offset] &= 0xfffffff0;
776         remap_dynamic_addresses();
736777         break;
737778
738779      case 0x05:      /* address register */
739         state->m_pci_ide_regs[offset] &= 0xfffffffc;
740         state->remap_dynamic_addresses();
780         m_pci_ide_regs[offset] &= 0xfffffffc;
781         remap_dynamic_addresses();
741782         break;
742783
743784      case 0x08:      /* address register */
744         state->m_pci_ide_regs[offset] &= 0xfffffff0;
745         state->remap_dynamic_addresses();
785         m_pci_ide_regs[offset] &= 0xfffffff0;
786         remap_dynamic_addresses();
746787         break;
747788
748789      case 0x14:      /* interrupt pending */
749790         if (data & 4)
750            state->ide_interrupt(0);
791            ide_interrupt(0);
751792         break;
752793   }
753794   if (LOG_PCI)
754      logerror("%06X:PCI IDE write: reg %d = %08X\n", space.device().safe_pc(), offset, data);
795      logerror("%06X:PCI IDE write: reg %d = %08X\n", safe_pc(), offset, data);
755796}
756797
757798
r26364r26365
762803 *
763804 *************************************/
764805
765static READ32_HANDLER( pci_3dfx_r )
806READ32_MEMBER( vegas_state::pci_3dfx_r )
766807{
767   vegas_state *state = space.machine().driver_data<vegas_state>();
768   int voodoo_type = voodoo_get_type(state->m_voodoo);
769   UINT32 result = state->m_pci_3dfx_regs[offset];
808   int voodoo_type = voodoo_get_type(m_voodoo);
809   UINT32 result = m_pci_3dfx_regs[offset];
770810
771811   switch (offset)
772812   {
r26364r26365
791831   }
792832
793833   if (LOG_PCI)
794      logerror("%06X:PCI 3dfx read: reg %d = %08X\n", space.device().safe_pc(), offset, result);
834      logerror("%06X:PCI 3dfx read: reg %d = %08X\n", safe_pc(), offset, result);
795835   return result;
796836}
797837
798838
799static WRITE32_HANDLER( pci_3dfx_w )
839WRITE32_MEMBER( vegas_state::pci_3dfx_w )
800840{
801   vegas_state *state = space.machine().driver_data<vegas_state>();
802   int voodoo_type = voodoo_get_type(state->m_voodoo);
841   int voodoo_type = voodoo_get_type(m_voodoo);
803842
804   state->m_pci_3dfx_regs[offset] = data;
843   m_pci_3dfx_regs[offset] = data;
805844
806845   switch (offset)
807846   {
808847      case 0x04:      /* address register */
809848         if (voodoo_type == TYPE_VOODOO_2)
810            state->m_pci_3dfx_regs[offset] &= 0xff000000;
849            m_pci_3dfx_regs[offset] &= 0xff000000;
811850         else
812            state->m_pci_3dfx_regs[offset] &= 0xfe000000;
813         state->remap_dynamic_addresses();
851            m_pci_3dfx_regs[offset] &= 0xfe000000;
852         remap_dynamic_addresses();
814853         break;
815854
816855      case 0x05:      /* address register */
817856         if (voodoo_type >= TYPE_VOODOO_BANSHEE)
818857         {
819            state->m_pci_3dfx_regs[offset] &= 0xfe000000;
820            state->remap_dynamic_addresses();
858            m_pci_3dfx_regs[offset] &= 0xfe000000;
859            remap_dynamic_addresses();
821860         }
822861         break;
823862
824863      case 0x06:      /* I/O register */
825864         if (voodoo_type >= TYPE_VOODOO_BANSHEE)
826865         {
827            state->m_pci_3dfx_regs[offset] &= 0xffffff00;
828            state->remap_dynamic_addresses();
866            m_pci_3dfx_regs[offset] &= 0xffffff00;
867            remap_dynamic_addresses();
829868         }
830869         break;
831870
832871      case 0x0c:      /* romBaseAddr register */
833872         if (voodoo_type >= TYPE_VOODOO_BANSHEE)
834873         {
835            state->m_pci_3dfx_regs[offset] &= 0xffff0000;
836            state->remap_dynamic_addresses();
874            m_pci_3dfx_regs[offset] &= 0xffff0000;
875            remap_dynamic_addresses();
837876         }
838877         break;
839878
840879      case 0x10:      /* initEnable register */
841         voodoo_set_init_enable(state->m_voodoo, data);
880         voodoo_set_init_enable(m_voodoo, data);
842881         break;
843882
844883   }
845884   if (LOG_PCI)
846      logerror("%06X:PCI 3dfx write: reg %d = %08X\n", space.device().safe_pc(), offset, data);
885      logerror("%06X:PCI 3dfx write: reg %d = %08X\n", safe_pc(), offset, data);
847886}
848887
849888
r26364r26365
950989 *
951990 *************************************/
952991
953static READ32_HANDLER( nile_r )
992READ32_MEMBER( vegas_state::nile_r )
954993{
955   vegas_state *state = space.machine().driver_data<vegas_state>();
956   UINT32 result = state->m_nile_regs[offset];
994   UINT32 result = m_nile_regs[offset];
957995   int logit = 1, which;
958996
959997   switch (offset)
960998   {
961999      case NREG_CPUSTAT+0:    /* CPU status */
9621000      case NREG_CPUSTAT+1:    /* CPU status */
963         if (LOG_NILE) logerror("%08X:NILE READ: CPU status(%03X) = %08X\n", space.device().safe_pc(), offset*4, result);
1001         if (LOG_NILE) logerror("%08X:NILE READ: CPU status(%03X) = %08X\n", safe_pc(), offset*4, result);
9641002         logit = 0;
9651003         break;
9661004
9671005      case NREG_INTCTRL+0:    /* Interrupt control */
9681006      case NREG_INTCTRL+1:    /* Interrupt control */
969         if (LOG_NILE) logerror("%08X:NILE READ: interrupt control(%03X) = %08X\n", space.device().safe_pc(), offset*4, result);
1007         if (LOG_NILE) logerror("%08X:NILE READ: interrupt control(%03X) = %08X\n", safe_pc(), offset*4, result);
9701008         logit = 0;
9711009         break;
9721010
9731011      case NREG_INTSTAT0+0:   /* Interrupt status 0 */
9741012      case NREG_INTSTAT0+1:   /* Interrupt status 0 */
975         if (LOG_NILE) logerror("%08X:NILE READ: interrupt status 0(%03X) = %08X\n", space.device().safe_pc(), offset*4, result);
1013         if (LOG_NILE) logerror("%08X:NILE READ: interrupt status 0(%03X) = %08X\n", safe_pc(), offset*4, result);
9761014         logit = 0;
9771015         break;
9781016
9791017      case NREG_INTSTAT1+0:   /* Interrupt status 1 */
9801018      case NREG_INTSTAT1+1:   /* Interrupt status 1 */
981         if (LOG_NILE) logerror("%08X:NILE READ: interrupt status 1/enable(%03X) = %08X\n", space.device().safe_pc(), offset*4, result);
1019         if (LOG_NILE) logerror("%08X:NILE READ: interrupt status 1/enable(%03X) = %08X\n", safe_pc(), offset*4, result);
9821020         logit = 0;
9831021         break;
9841022
9851023      case NREG_INTCLR+0:     /* Interrupt clear */
9861024      case NREG_INTCLR+1:     /* Interrupt clear */
987         if (LOG_NILE) logerror("%08X:NILE READ: interrupt clear(%03X) = %08X\n", space.device().safe_pc(), offset*4, result);
1025         if (LOG_NILE) logerror("%08X:NILE READ: interrupt clear(%03X) = %08X\n", safe_pc(), offset*4, result);
9881026         logit = 0;
9891027         break;
9901028
9911029      case NREG_INTPPES+0:    /* PCI Interrupt control */
9921030      case NREG_INTPPES+1:    /* PCI Interrupt control */
993         if (LOG_NILE) logerror("%08X:NILE READ: PCI interrupt control(%03X) = %08X\n", space.device().safe_pc(), offset*4, result);
1031         if (LOG_NILE) logerror("%08X:NILE READ: PCI interrupt control(%03X) = %08X\n", safe_pc(), offset*4, result);
9941032         logit = 0;
9951033         break;
9961034
r26364r26365
10101048      case NREG_T2CNTR:       /* general purpose timer control (counter) */
10111049      case NREG_T3CNTR:       /* watchdog timer control (counter) */
10121050         which = (offset - NREG_T0CTRL) / 4;
1013         if (state->m_nile_regs[offset - 1] & 1)
1051         if (m_nile_regs[offset - 1] & 1)
10141052         {
1015            if (state->m_nile_regs[offset] & 2)
1053            if (m_nile_regs[offset] & 2)
10161054               logerror("Unexpected value: timer %d is prescaled\n", which);
1017            result = state->m_nile_regs[offset + 1] = state->m_timer[which]->remaining().as_double() * (double)SYSTEM_CLOCK;
1055            result = m_nile_regs[offset + 1] = m_timer[which]->remaining().as_double() * (double)SYSTEM_CLOCK;
10181056         }
10191057
1020         if (LOG_TIMERS) logerror("%08X:NILE READ: timer %d counter(%03X) = %08X\n", space.device().safe_pc(), which, offset*4, result);
1058         if (LOG_TIMERS) logerror("%08X:NILE READ: timer %d counter(%03X) = %08X\n", safe_pc(), which, offset*4, result);
10211059         logit = 0;
10221060         break;
10231061
10241062      case NREG_UARTIIR:          /* serial port interrupt ID */
1025         if (state->m_nile_regs[NREG_UARTIER] & 2)
1063         if (m_nile_regs[NREG_UARTIER] & 2)
10261064            result = 0x02;          /* transmitter buffer IRQ pending */
10271065         else
10281066            result = 0x01;          /* no IRQ pending */
r26364r26365
10581096   }
10591097
10601098   if (LOG_NILE && logit)
1061      logerror("%06X:nile read from offset %03X = %08X\n", space.device().safe_pc(), offset*4, result);
1099      logerror("%06X:nile read from offset %03X = %08X\n", safe_pc(), offset*4, result);
10621100   return result;
10631101}
10641102
10651103
1066static WRITE32_HANDLER( nile_w )
1104WRITE32_MEMBER( vegas_state::nile_w )
10671105{
1068   vegas_state *state = space.machine().driver_data<vegas_state>();
1069   UINT32 olddata = state->m_nile_regs[offset];
1106   UINT32 olddata = m_nile_regs[offset];
10701107   int logit = 1, which;
10711108
1072   COMBINE_DATA(&state->m_nile_regs[offset]);
1109   COMBINE_DATA(&m_nile_regs[offset]);
10731110
10741111   switch (offset)
10751112   {
10761113      case NREG_CPUSTAT+0:    /* CPU status */
10771114      case NREG_CPUSTAT+1:    /* CPU status */
1078         if (LOG_NILE) logerror("%08X:NILE WRITE: CPU status(%03X) = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask);
1115         if (LOG_NILE) logerror("%08X:NILE WRITE: CPU status(%03X) = %08X & %08X\n", safe_pc(), offset*4, data, mem_mask);
10791116         logit = 0;
10801117         break;
10811118
10821119      case NREG_INTCTRL+0:    /* Interrupt control */
10831120      case NREG_INTCTRL+1:    /* Interrupt control */
1084         if (LOG_NILE) logerror("%08X:NILE WRITE: interrupt control(%03X) = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask);
1121         if (LOG_NILE) logerror("%08X:NILE WRITE: interrupt control(%03X) = %08X & %08X\n", safe_pc(), offset*4, data, mem_mask);
10851122         logit = 0;
1086         state->update_nile_irqs();
1123         update_nile_irqs();
10871124         break;
10881125
10891126      case NREG_INTSTAT0+0:   /* Interrupt status 0 */
10901127      case NREG_INTSTAT0+1:   /* Interrupt status 0 */
1091         if (LOG_NILE) logerror("%08X:NILE WRITE: interrupt status 0(%03X) = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask);
1128         if (LOG_NILE) logerror("%08X:NILE WRITE: interrupt status 0(%03X) = %08X & %08X\n", safe_pc(), offset*4, data, mem_mask);
10921129         logit = 0;
1093         state->update_nile_irqs();
1130         update_nile_irqs();
10941131         break;
10951132
10961133      case NREG_INTSTAT1+0:   /* Interrupt status 1 */
10971134      case NREG_INTSTAT1+1:   /* Interrupt status 1 */
1098         if (LOG_NILE) logerror("%08X:NILE WRITE: interrupt status 1/enable(%03X) = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask);
1135         if (LOG_NILE) logerror("%08X:NILE WRITE: interrupt status 1/enable(%03X) = %08X & %08X\n", safe_pc(), offset*4, data, mem_mask);
10991136         logit = 0;
1100         state->update_nile_irqs();
1137         update_nile_irqs();
11011138         break;
11021139
11031140      case NREG_INTCLR+0:     /* Interrupt clear */
11041141      case NREG_INTCLR+1:     /* Interrupt clear */
1105         if (LOG_NILE) logerror("%08X:NILE WRITE: interrupt clear(%03X) = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask);
1142         if (LOG_NILE) logerror("%08X:NILE WRITE: interrupt clear(%03X) = %08X & %08X\n", safe_pc(), offset*4, data, mem_mask);
11061143         logit = 0;
1107         state->m_nile_irq_state &= ~(state->m_nile_regs[offset] & ~0xf00);
1108         state->update_nile_irqs();
1144         m_nile_irq_state &= ~(m_nile_regs[offset] & ~0xf00);
1145         update_nile_irqs();
11091146         break;
11101147
11111148      case NREG_INTPPES+0:    /* PCI Interrupt control */
11121149      case NREG_INTPPES+1:    /* PCI Interrupt control */
1113         if (LOG_NILE) logerror("%08X:NILE WRITE: PCI interrupt control(%03X) = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask);
1150         if (LOG_NILE) logerror("%08X:NILE WRITE: PCI interrupt control(%03X) = %08X & %08X\n", safe_pc(), offset*4, data, mem_mask);
11141151         logit = 0;
11151152         break;
11161153
r26364r26365
11251162         break;
11261163
11271164      case NREG_PCIINIT1+0:   /* PCI master */
1128         if (((olddata & 0xe) == 0xa) != ((state->m_nile_regs[offset] & 0xe) == 0xa))
1129            state->remap_dynamic_addresses();
1165         if (((olddata & 0xe) == 0xa) != ((m_nile_regs[offset] & 0xe) == 0xa))
1166            remap_dynamic_addresses();
11301167         logit = 0;
11311168         break;
11321169
r26364r26365
11351172      case NREG_T2CTRL+1:     /* general purpose timer control (control bits) */
11361173      case NREG_T3CTRL+1:     /* watchdog timer control (control bits) */
11371174         which = (offset - NREG_T0CTRL) / 4;
1138         if (LOG_NILE) logerror("%08X:NILE WRITE: timer %d control(%03X) = %08X & %08X\n", space.device().safe_pc(), which, offset*4, data, mem_mask);
1175         if (LOG_NILE) logerror("%08X:NILE WRITE: timer %d control(%03X) = %08X & %08X\n", safe_pc(), which, offset*4, data, mem_mask);
11391176         logit = 0;
11401177
11411178         /* timer just enabled? */
1142         if (!(olddata & 1) && (state->m_nile_regs[offset] & 1))
1179         if (!(olddata & 1) && (m_nile_regs[offset] & 1))
11431180         {
1144            UINT32 scale = state->m_nile_regs[offset + 1];
1145            if (state->m_nile_regs[offset] & 2)
1181            UINT32 scale = m_nile_regs[offset + 1];
1182            if (m_nile_regs[offset] & 2)
11461183               logerror("Unexpected value: timer %d is prescaled\n", which);
11471184            if (scale != 0)
1148               state->m_timer[which]->adjust(TIMER_PERIOD * scale, which);
1149            if (LOG_TIMERS) logerror("Starting timer %d at a rate of %d Hz\n", which, (int)ATTOSECONDS_TO_HZ((TIMER_PERIOD * (state->m_nile_regs[offset + 1] + 1)).attoseconds));
1185               m_timer[which]->adjust(TIMER_PERIOD * scale, which);
1186            if (LOG_TIMERS) logerror("Starting timer %d at a rate of %d Hz\n", which, (int)ATTOSECONDS_TO_HZ((TIMER_PERIOD * (m_nile_regs[offset + 1] + 1)).attoseconds));
11501187         }
11511188
11521189         /* timer disabled? */
1153         else if ((olddata & 1) && !(state->m_nile_regs[offset] & 1))
1190         else if ((olddata & 1) && !(m_nile_regs[offset] & 1))
11541191         {
1155            if (state->m_nile_regs[offset] & 2)
1192            if (m_nile_regs[offset] & 2)
11561193               logerror("Unexpected value: timer %d is prescaled\n", which);
1157            state->m_nile_regs[offset + 1] = state->m_timer[which]->remaining().as_double() * SYSTEM_CLOCK;
1158            state->m_timer[which]->adjust(attotime::never, which);
1194            m_nile_regs[offset + 1] = m_timer[which]->remaining().as_double() * SYSTEM_CLOCK;
1195            m_timer[which]->adjust(attotime::never, which);
11591196         }
11601197         break;
11611198
r26364r26365
11641201      case NREG_T2CNTR:       /* general purpose timer control (counter) */
11651202      case NREG_T3CNTR:       /* watchdog timer control (counter) */
11661203         which = (offset - NREG_T0CTRL) / 4;
1167         if (LOG_TIMERS) logerror("%08X:NILE WRITE: timer %d counter(%03X) = %08X & %08X\n", space.device().safe_pc(), which, offset*4, data, mem_mask);
1204         if (LOG_TIMERS) logerror("%08X:NILE WRITE: timer %d counter(%03X) = %08X & %08X\n", safe_pc(), which, offset*4, data, mem_mask);
11681205         logit = 0;
11691206
1170         if (state->m_nile_regs[offset - 1] & 1)
1207         if (m_nile_regs[offset - 1] & 1)
11711208         {
1172            if (state->m_nile_regs[offset - 1] & 2)
1209            if (m_nile_regs[offset - 1] & 2)
11731210               logerror("Unexpected value: timer %d is prescaled\n", which);
1174            state->m_timer[which]->adjust(TIMER_PERIOD * state->m_nile_regs[offset], which);
1211            m_timer[which]->adjust(TIMER_PERIOD * m_nile_regs[offset], which);
11751212         }
11761213         break;
11771214
r26364r26365
11801217         logit = 0;
11811218         break;
11821219      case NREG_UARTIER:      /* serial interrupt enable */
1183         state->update_nile_irqs();
1220         update_nile_irqs();
11841221         break;
11851222
11861223      case NREG_VID:
r26364r26365
12141251      case NREG_DCS8:
12151252      case NREG_PCIW0:
12161253      case NREG_PCIW1:
1217         state->remap_dynamic_addresses();
1254         remap_dynamic_addresses();
12181255         break;
12191256   }
12201257
12211258   if (LOG_NILE && logit)
1222      logerror("%06X:nile write to offset %03X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask);
1259      logerror("%06X:nile write to offset %03X = %08X & %08X\n", safe_pc(), offset*4, data, mem_mask);
12231260}
12241261
12251262
r26364r26365
12971334}
12981335
12991336
1300static READ32_HANDLER( sio_irq_clear_r )
1337READ32_MEMBER( vegas_state::sio_irq_clear_r )
13011338{
1302   vegas_state *state = space.machine().driver_data<vegas_state>();
1303   return state->m_sio_irq_clear;
1339   return m_sio_irq_clear;
13041340}
13051341
13061342
1307static WRITE32_HANDLER( sio_irq_clear_w )
1343WRITE32_MEMBER( vegas_state::sio_irq_clear_w )
13081344{
1309   vegas_state *state = space.machine().driver_data<vegas_state>();
13101345   if (ACCESSING_BITS_0_7)
13111346   {
1312      state->m_sio_irq_clear = data;
1347      m_sio_irq_clear = data;
13131348
13141349      /* bit 0x01 seems to be used to reset the IOASIC */
13151350      if (!(data & 0x01))
r26364r26365
13211356      /* they toggle bit 0x08 low to reset the VBLANK */
13221357      if (!(data & 0x08))
13231358      {
1324         state->m_sio_irq_state &= ~0x20;
1325         state->update_sio_irqs();
1359         m_sio_irq_state &= ~0x20;
1360         update_sio_irqs();
13261361      }
13271362   }
13281363}
13291364
13301365
1331static READ32_HANDLER( sio_irq_enable_r )
1366READ32_MEMBER( vegas_state::sio_irq_enable_r )
13321367{
1333   vegas_state *state = space.machine().driver_data<vegas_state>();
1334   return state->m_sio_irq_enable;
1368   return m_sio_irq_enable;
13351369}
13361370
13371371
1338static WRITE32_HANDLER( sio_irq_enable_w )
1372WRITE32_MEMBER( vegas_state::sio_irq_enable_w )
13391373{
1340   vegas_state *state = space.machine().driver_data<vegas_state>();
13411374   if (ACCESSING_BITS_0_7)
13421375   {
1343      state->m_sio_irq_enable = data;
1344      state->update_sio_irqs();
1376      m_sio_irq_enable = data;
1377      update_sio_irqs();
13451378   }
13461379}
13471380
13481381
1349static READ32_HANDLER( sio_irq_cause_r )
1382READ32_MEMBER( vegas_state::sio_irq_cause_r )
13501383{
1351   vegas_state *state = space.machine().driver_data<vegas_state>();
1352   return state->m_sio_irq_state & state->m_sio_irq_enable;
1384   return m_sio_irq_state & m_sio_irq_enable;
13531385}
13541386
13551387
1356static READ32_HANDLER( sio_irq_status_r )
1388READ32_MEMBER( vegas_state::sio_irq_status_r )
13571389{
1358   vegas_state *state = space.machine().driver_data<vegas_state>();
1359   return state->m_sio_irq_state;
1390   return m_sio_irq_state;
13601391}
13611392
13621393
1363static WRITE32_HANDLER( sio_led_w )
1394WRITE32_MEMBER( vegas_state::sio_led_w )
13641395{
1365   vegas_state *state = space.machine().driver_data<vegas_state>();
13661396   if (ACCESSING_BITS_0_7)
1367      state->m_sio_led_state = data;
1397      m_sio_led_state = data;
13681398}
13691399
13701400
1371static READ32_HANDLER( sio_led_r )
1401READ32_MEMBER( vegas_state::sio_led_r )
13721402{
1373   vegas_state *state = space.machine().driver_data<vegas_state>();
1374   return state->m_sio_led_state;
1403   return m_sio_led_state;
13751404}
13761405
13771406
r26364r26365
13821411 *
13831412 *************************************/
13841413
1385static WRITE32_HANDLER( sio_w )
1414WRITE32_MEMBER( vegas_state::sio_w )
13861415{
1387   vegas_state *state = space.machine().driver_data<vegas_state>();
13881416   if (ACCESSING_BITS_0_7) offset += 0;
13891417   if (ACCESSING_BITS_8_15) offset += 1;
13901418   if (ACCESSING_BITS_16_23) offset += 2;
13911419   if (ACCESSING_BITS_24_31) offset += 3;
13921420   if (LOG_SIO && offset != 0)
1393      logerror("%08X:sio write to offset %X = %02X\n", space.device().safe_pc(), offset, data >> (offset*8));
1421      logerror("%08X:sio write to offset %X = %02X\n", safe_pc(), offset, data >> (offset*8));
13941422   if (offset < 4)
1395      state->m_sio_data[offset] = data >> (offset*8);
1423      m_sio_data[offset] = data >> (offset*8);
13961424   if (offset == 1)
1397      state->m_sio_data[2] = (state->m_sio_data[2] & ~0x02) | ((state->m_sio_data[1] & 0x01) << 1) | (state->m_sio_data[1] & 0x01);
1425      m_sio_data[2] = (m_sio_data[2] & ~0x02) | ((m_sio_data[1] & 0x01) << 1) | (m_sio_data[1] & 0x01);
13981426}
13991427
14001428
1401static READ32_HANDLER( sio_r )
1429READ32_MEMBER( vegas_state::sio_r )
14021430{
1403   vegas_state *state = space.machine().driver_data<vegas_state>();
14041431   UINT32 result = 0;
14051432   if (ACCESSING_BITS_0_7) offset += 0;
14061433   if (ACCESSING_BITS_8_15) offset += 1;
14071434   if (ACCESSING_BITS_16_23) offset += 2;
14081435   if (ACCESSING_BITS_24_31) offset += 3;
14091436   if (offset < 4)
1410      result = state->m_sio_data[0] | (state->m_sio_data[1] << 8) | (state->m_sio_data[2] << 16) | (state->m_sio_data[3] << 24);
1437      result = m_sio_data[0] | (m_sio_data[1] << 8) | (m_sio_data[2] << 16) | (m_sio_data[3] << 24);
14111438   if (LOG_SIO && offset != 2)
1412      logerror("%08X:sio read from offset %X = %02X\n", space.device().safe_pc(), offset, result >> (offset*8));
1439      logerror("%08X:sio read from offset %X = %02X\n", safe_pc(), offset, result >> (offset*8));
14131440   return result;
14141441}
14151442
r26364r26365
14211448 *
14221449 *************************************/
14231450
1424static READ32_HANDLER( analog_port_r )
1451READ32_MEMBER( vegas_state::analog_port_r )
14251452{
1426   vegas_state *state = space.machine().driver_data<vegas_state>();
1427   return state->m_pending_analog_read;
1453   return m_pending_analog_read;
14281454}
14291455
14301456
1431static WRITE32_HANDLER( analog_port_w )
1457WRITE32_MEMBER( vegas_state::analog_port_w )
14321458{
1433   vegas_state *state = space.machine().driver_data<vegas_state>();
14341459   static const char *const portnames[] = { "AN0", "AN1", "AN2", "AN3", "AN4", "AN5", "AN6", "AN7" };
14351460
14361461   if (data < 8 || data > 15)
1437      logerror("%08X:Unexpected analog port select = %08X\n", space.device().safe_pc(), data);
1438   state->m_pending_analog_read = state->ioport(portnames[data & 7])->read_safe(0);
1462      logerror("%08X:Unexpected analog port select = %08X\n", safe_pc(), data);
1463   m_pending_analog_read = ioport(portnames[data & 7])->read_safe(0);
14391464}
14401465
14411466
r26364r26365
14461471 *
14471472 *************************************/
14481473
1449static WRITE32_HANDLER( vegas_watchdog_w )
1474WRITE32_MEMBER( vegas_state::vegas_watchdog_w )
14501475{
14511476   space.device().execute().eat_cycles(100);
14521477}
14531478
14541479
1455static WRITE32_HANDLER( asic_fifo_w )
1480WRITE32_MEMBER( vegas_state::asic_fifo_w )
14561481{
14571482   midway_ioasic_fifo_w(space.machine(), data);
14581483}
14591484
14601485
1461static READ32_DEVICE_HANDLER( ide_main_r )
1486READ32_MEMBER( vegas_state::ide_main_r )
14621487{
1463   bus_master_ide_controller_device *ide = (bus_master_ide_controller_device *) device;
1464   return ide->read_cs0(space, offset, mem_mask);
1488   return m_ide->read_cs0(space, offset, mem_mask);
14651489}
14661490
14671491
1468static WRITE32_DEVICE_HANDLER( ide_main_w )
1492WRITE32_MEMBER( vegas_state::ide_main_w )
14691493{
1470   bus_master_ide_controller_device *ide = (bus_master_ide_controller_device *) device;
1471   ide->write_cs0(space, offset, data, mem_mask);
1494   m_ide->write_cs0(space, offset, data, mem_mask);
14721495}
14731496
14741497
1475static READ32_DEVICE_HANDLER( ide_alt_r )
1498READ32_MEMBER( vegas_state::ide_alt_r )
14761499{
1477   bus_master_ide_controller_device *ide = (bus_master_ide_controller_device *) device;
1478   return ide->read_cs1(space, offset + 1, mem_mask);
1500   return m_ide->read_cs1(space, offset + 1, mem_mask);
14791501}
14801502
14811503
1482static WRITE32_DEVICE_HANDLER( ide_alt_w )
1504WRITE32_MEMBER( vegas_state::ide_alt_w )
14831505{
1484   bus_master_ide_controller_device *ide = (bus_master_ide_controller_device *) device;
1485   ide->write_cs1(space, offset + 1, data, mem_mask);
1506   m_ide->write_cs1(space, offset + 1, data, mem_mask);
14861507}
14871508
14881509
1489static READ32_DEVICE_HANDLER( ide_bus_master32_r )
1510READ32_MEMBER( vegas_state::ide_bus_master32_r )
14901511{
1491   bus_master_ide_controller_device *ide = (bus_master_ide_controller_device *) device;
1492   return ide->bmdma_r(space, offset, mem_mask);
1512   return m_ide->bmdma_r(space, offset, mem_mask);
14931513}
14941514
14951515
1496static WRITE32_DEVICE_HANDLER( ide_bus_master32_w )
1516WRITE32_MEMBER( vegas_state::ide_bus_master32_w )
14971517{
1498   bus_master_ide_controller_device *ide = (bus_master_ide_controller_device *) device;
1499   ide->bmdma_w(space, offset, data, mem_mask);
1518   m_ide->bmdma_w(space, offset, data, mem_mask);
15001519}
15011520
15021521
1503static READ32_DEVICE_HANDLER( ethernet_r )
1522READ32_MEMBER( vegas_state::ethernet_r )
15041523{
1505   smc91c94_device *ethernet = space.machine().device<smc91c94_device>("ethernet");
1506
15071524   UINT32 result = 0;
15081525   if (ACCESSING_BITS_0_15)
1509      result |= ethernet->read(space, offset * 2 + 0, mem_mask);
1526      result |= m_ethernet->read(space, offset * 2 + 0, mem_mask);
15101527   if (ACCESSING_BITS_16_31)
1511      result |= ethernet->read(space, offset * 2 + 1, mem_mask >> 16) << 16;
1528      result |= m_ethernet->read(space, offset * 2 + 1, mem_mask >> 16) << 16;
15121529   return result;
15131530}
15141531
15151532
1516static WRITE32_DEVICE_HANDLER( ethernet_w )
1533WRITE32_MEMBER( vegas_state::ethernet_w )
15171534{
1518   smc91c94_device *ethernet = space.machine().device<smc91c94_device>("ethernet");
1519
15201535   if (ACCESSING_BITS_0_15)
1521      ethernet->write(space, offset * 2 + 0, data, mem_mask);
1536      m_ethernet->write(space, offset * 2 + 0, data, mem_mask);
15221537   if (ACCESSING_BITS_16_31)
1523      ethernet->write(space, offset * 2 + 1, data >> 16, mem_mask >> 16);
1538      m_ethernet->write(space, offset * 2 + 1, data >> 16, mem_mask >> 16);
15241539}
15251540
15261541
1527static WRITE32_HANDLER( dcs3_fifo_full_w )
1542WRITE32_MEMBER( vegas_state::dcs3_fifo_full_w )
15281543{
15291544   midway_ioasic_fifo_full_w(space.machine(), data);
15301545}
r26364r26365
15371552 *
15381553 *************************************/
15391554
1540#define add_dynamic_address(s,e,r,w)         _add_dynamic_address(s,e,r,w,#r,#w)
1541#define add_dynamic_device_address(d,s,e,r,w)    _add_dynamic_device_address(d,s,e,r,w,#r,#w)
1555#define add_dynamic_address(s,e,r,w)         _add_dynamic_address(s,e,r,w)
15421556
1543inline void vegas_state::_add_dynamic_address(offs_t start, offs_t end, read32_space_func read, write32_space_func write, const char *rdname, const char *wrname)
1557#define add_legacy_dynamic_address(s,e,r,w)         _add_legacy_dynamic_address(s,e,r,w,#r,#w)
1558#define add_legacy_dynamic_device_address(d,s,e,r,w)    _add_legacy_dynamic_device_address(d,s,e,r,w,#r,#w)
1559
1560inline void vegas_state::_add_dynamic_address(offs_t start, offs_t end, read32_delegate read, write32_delegate write)
15441561{
15451562   dynamic_address *dynamic = m_dynamic;
15461563   dynamic[m_dynamic_count].start = start;
15471564   dynamic[m_dynamic_count].end = end;
1548   dynamic[m_dynamic_count].mread = read;
1549   dynamic[m_dynamic_count].mwrite = write;
1550   dynamic[m_dynamic_count].dread = NULL;
1551   dynamic[m_dynamic_count].dwrite = NULL;
1552   dynamic[m_dynamic_count].device = NULL;
1553   dynamic[m_dynamic_count].rdname = rdname;
1554   dynamic[m_dynamic_count].wrname = wrname;
1565   dynamic[m_dynamic_count].read = read;
1566   dynamic[m_dynamic_count].write = write;
15551567   m_dynamic_count++;
15561568}
15571569
1558inline void vegas_state::_add_dynamic_device_address(device_t *device, offs_t start, offs_t end, read32_device_func read, write32_device_func write, const char *rdname, const char *wrname)
1570inline void vegas_state::_add_legacy_dynamic_address(offs_t start, offs_t end, read32_space_func read, write32_space_func write, const char *rdname, const char *wrname)
15591571{
1560   dynamic_address *dynamic = m_dynamic;
1561   dynamic[m_dynamic_count].start = start;
1562   dynamic[m_dynamic_count].end = end;
1563   dynamic[m_dynamic_count].mread = NULL;
1564   dynamic[m_dynamic_count].mwrite = NULL;
1565   dynamic[m_dynamic_count].dread = read;
1566   dynamic[m_dynamic_count].dwrite = write;
1567   dynamic[m_dynamic_count].device = device;
1568   dynamic[m_dynamic_count].rdname = rdname;
1569   dynamic[m_dynamic_count].wrname = wrname;
1570   m_dynamic_count++;
1572   legacy_dynamic_address *l_dynamic = m_legacy_dynamic;
1573   l_dynamic[m_legacy_dynamic_count].start = start;
1574   l_dynamic[m_legacy_dynamic_count].end = end;
1575   l_dynamic[m_legacy_dynamic_count].mread = read;
1576   l_dynamic[m_legacy_dynamic_count].mwrite = write;
1577   l_dynamic[m_legacy_dynamic_count].dread = NULL;
1578   l_dynamic[m_legacy_dynamic_count].dwrite = NULL;
1579   l_dynamic[m_legacy_dynamic_count].device = NULL;
1580   l_dynamic[m_legacy_dynamic_count].rdname = rdname;
1581   l_dynamic[m_legacy_dynamic_count].wrname = wrname;
1582   m_legacy_dynamic_count++;
15711583}
15721584
1585inline void vegas_state::_add_legacy_dynamic_device_address(device_t *device, offs_t start, offs_t end, read32_device_func read, write32_device_func write, const char *rdname, const char *wrname)
1586{
1587   legacy_dynamic_address *l_dynamic = m_legacy_dynamic;
1588   l_dynamic[m_legacy_dynamic_count].start = start;
1589   l_dynamic[m_legacy_dynamic_count].end = end;
1590   l_dynamic[m_legacy_dynamic_count].mread = NULL;
1591   l_dynamic[m_legacy_dynamic_count].mwrite = NULL;
1592   l_dynamic[m_legacy_dynamic_count].dread = read;
1593   l_dynamic[m_legacy_dynamic_count].dwrite = write;
1594   l_dynamic[m_legacy_dynamic_count].device = device;
1595   l_dynamic[m_legacy_dynamic_count].rdname = rdname;
1596   l_dynamic[m_legacy_dynamic_count].wrname = wrname;
1597   m_legacy_dynamic_count++;
1598}
15731599
1600
1601
15741602void vegas_state::remap_dynamic_addresses()
15751603{
15761604   dynamic_address *dynamic = m_dynamic;
1577   device_t *ethernet = machine().device("ethernet");
1578   device_t *ide = machine().device("ide");
1605   legacy_dynamic_address *l_dynamic = m_legacy_dynamic;
15791606   int voodoo_type = voodoo_get_type(m_voodoo);
15801607   offs_t base;
1581   int addr;
1608   int addr, l_addr;
15821609
15831610   /* unmap everything we know about */
15841611   for (addr = 0; addr < m_dynamic_count; addr++)
15851612      m_maincpu->space(AS_PROGRAM).unmap_readwrite(dynamic[addr].start, dynamic[addr].end);
1613   
1614   for (l_addr = 0; l_addr < m_legacy_dynamic_count; l_addr++)
1615      m_maincpu->space(AS_PROGRAM).unmap_readwrite(l_dynamic[l_addr].start, l_dynamic[l_addr].end);
15861616
15871617   /* the build the list of stuff */
15881618   m_dynamic_count = 0;
1619   m_legacy_dynamic_count = 0;
15891620
15901621   /* DCS2 */
15911622   base = m_nile_regs[NREG_DCS2] & 0x1fffff00;
15921623   if (base >= m_rambase.bytes())
15931624   {
1594      add_dynamic_address(base + 0x0000, base + 0x0003, sio_irq_clear_r, sio_irq_clear_w);
1595      add_dynamic_address(base + 0x1000, base + 0x1003, sio_irq_enable_r, sio_irq_enable_w);
1596      add_dynamic_address(base + 0x2000, base + 0x2003, sio_irq_cause_r, NULL);
1597      add_dynamic_address(base + 0x3000, base + 0x3003, sio_irq_status_r, NULL);
1598      add_dynamic_address(base + 0x4000, base + 0x4003, sio_led_r, sio_led_w);
1599      add_dynamic_address(base + 0x5000, base + 0x5007, NOP_HANDLER, NULL);
1600      add_dynamic_address(base + 0x6000, base + 0x6003, NULL, cmos_unlock_w);
1601      add_dynamic_address(base + 0x7000, base + 0x7003, NULL, vegas_watchdog_w);
1625      add_dynamic_address(base + 0x0000, base + 0x0003, read32_delegate(FUNC(vegas_state::sio_irq_clear_r), this), write32_delegate(FUNC(vegas_state::sio_irq_clear_w), this));
1626      add_dynamic_address(base + 0x1000, base + 0x1003, read32_delegate(FUNC(vegas_state::sio_irq_enable_r), this), write32_delegate(FUNC(vegas_state::sio_irq_enable_w), this));
1627      add_dynamic_address(base + 0x2000, base + 0x2003, read32_delegate(FUNC(vegas_state::sio_irq_cause_r), this), write32_delegate());
1628      add_dynamic_address(base + 0x3000, base + 0x3003, read32_delegate(FUNC(vegas_state::sio_irq_status_r), this), write32_delegate());
1629      add_dynamic_address(base + 0x4000, base + 0x4003, read32_delegate(FUNC(vegas_state::sio_led_r), this), write32_delegate(FUNC(vegas_state::sio_led_w), this));
1630      add_dynamic_address(base + 0x5000, base + 0x5007, NOP_HANDLER, write32_delegate());
1631      add_dynamic_address(base + 0x6000, base + 0x6003, read32_delegate(), write32_delegate(FUNC(vegas_state::cmos_unlock_w), this));
1632      add_dynamic_address(base + 0x7000, base + 0x7003, read32_delegate(), write32_delegate(FUNC(vegas_state::vegas_watchdog_w), this));
16021633   }
16031634
16041635   /* DCS3 */
16051636   base = m_nile_regs[NREG_DCS3] & 0x1fffff00;
16061637   if (base >= m_rambase.bytes())
1607      add_dynamic_address(base + 0x0000, base + 0x0003, analog_port_r, analog_port_w);
1638      add_dynamic_address(base + 0x0000, base + 0x0003, read32_delegate(FUNC(vegas_state::analog_port_r), this), write32_delegate(FUNC(vegas_state::analog_port_w), this));
16081639
16091640   /* DCS4 */
16101641   base = m_nile_regs[NREG_DCS4] & 0x1fffff00;
16111642   if (base >= m_rambase.bytes())
1612      add_dynamic_address(base + 0x0000, base + 0x7fff, timekeeper_r, timekeeper_w);
1643      add_dynamic_address(base + 0x0000, base + 0x7fff, read32_delegate(FUNC(vegas_state::timekeeper_r), this), write32_delegate(FUNC(vegas_state::timekeeper_w), this));
16131644
16141645   /* DCS5 */
16151646   base = m_nile_regs[NREG_DCS5] & 0x1fffff00;
16161647   if (base >= m_rambase.bytes())
1617      add_dynamic_address(base + 0x0000, base + 0x0003, sio_r, sio_w);
1648      add_dynamic_address(base + 0x0000, base + 0x0003, read32_delegate(FUNC(vegas_state::sio_r), this), write32_delegate(FUNC(vegas_state::sio_w), this));
16181649
16191650   /* DCS6 */
16201651   base = m_nile_regs[NREG_DCS6] & 0x1fffff00;
16211652   if (base >= m_rambase.bytes())
16221653   {
1623      add_dynamic_address(base + 0x0000, base + 0x003f, midway_ioasic_packed_r, midway_ioasic_packed_w);
1624      add_dynamic_address(base + 0x1000, base + 0x1003, NULL, asic_fifo_w);
1654      add_legacy_dynamic_address(base + 0x0000, base + 0x003f, midway_ioasic_packed_r, midway_ioasic_packed_w);
1655      add_dynamic_address(base + 0x1000, base + 0x1003, read32_delegate(), write32_delegate(FUNC(vegas_state::asic_fifo_w), this));
16251656      if (m_dcs_idma_cs != 0)
1626         add_dynamic_address(base + 0x3000, base + 0x3003, NULL, dcs3_fifo_full_w);
1657         add_dynamic_address(base + 0x3000, base + 0x3003, read32_delegate(), write32_delegate(FUNC(vegas_state::dcs3_fifo_full_w), this));
16271658      if (m_dcs_idma_cs == 6)
16281659      {
1629         add_dynamic_address(base + 0x5000, base + 0x5003, NULL, dsio_idma_addr_w);
1630         add_dynamic_address(base + 0x7000, base + 0x7003, dsio_idma_data_r, dsio_idma_data_w);
1660         add_legacy_dynamic_address(base + 0x5000, base + 0x5003, NULL, dsio_idma_addr_w);
1661         add_legacy_dynamic_address(base + 0x7000, base + 0x7003, dsio_idma_data_r, dsio_idma_data_w);
16311662      }
16321663   }
16331664
r26364r26365
16351666   base = m_nile_regs[NREG_DCS7] & 0x1fffff00;
16361667   if (base >= m_rambase.bytes())
16371668   {
1638      add_dynamic_device_address(ethernet, base + 0x1000, base + 0x100f, ethernet_r, ethernet_w);
1669      add_dynamic_address(base + 0x1000, base + 0x100f, read32_delegate(FUNC(vegas_state::ethernet_r), this), write32_delegate(FUNC(vegas_state::ethernet_w), this));
16391670      if (m_dcs_idma_cs == 7)
16401671      {
1641         add_dynamic_address(base + 0x5000, base + 0x5003, NULL, dsio_idma_addr_w);
1642         add_dynamic_address(base + 0x7000, base + 0x7003, dsio_idma_data_r, dsio_idma_data_w);
1672         add_legacy_dynamic_address(base + 0x5000, base + 0x5003, NULL, dsio_idma_addr_w);
1673         add_legacy_dynamic_address(base + 0x7000, base + 0x7003, dsio_idma_data_r, dsio_idma_data_w);
16431674      }
16441675   }
16451676
r26364r26365
16491680      base = m_nile_regs[NREG_PCIW1] & 0x1fffff00;
16501681      if (base >= m_rambase.bytes())
16511682      {
1652         add_dynamic_address(base + (1 << (21 + 4)) + 0x0000, base + (1 << (21 + 4)) + 0x00ff, pci_3dfx_r, pci_3dfx_w);
1653         add_dynamic_address(base + (1 << (21 + 5)) + 0x0000, base + (1 << (21 + 5)) + 0x00ff, pci_ide_r, pci_ide_w);
1683         add_dynamic_address(base + (1 << (21 + 4)) + 0x0000, base + (1 << (21 + 4)) + 0x00ff, read32_delegate(FUNC(vegas_state::pci_3dfx_r), this),  write32_delegate(FUNC(vegas_state::pci_3dfx_w), this));
1684         add_dynamic_address(base + (1 << (21 + 5)) + 0x0000, base + (1 << (21 + 5)) + 0x00ff, read32_delegate(FUNC(vegas_state::pci_ide_r), this),  write32_delegate(FUNC(vegas_state::pci_ide_w), this));
16541685      }
16551686   }
16561687
r26364r26365
16601691      /* IDE controller */
16611692      base = m_pci_ide_regs[0x04] & 0xfffffff0;
16621693      if (base >= m_rambase.bytes() && base < 0x20000000)
1663         add_dynamic_device_address(ide, base + 0x0000, base + 0x000f, ide_main_r, ide_main_w);
1694         add_dynamic_address(base + 0x0000, base + 0x000f, read32_delegate(FUNC(vegas_state::ide_main_r), this),  write32_delegate(FUNC(vegas_state::ide_main_w), this));
16641695
16651696      base = m_pci_ide_regs[0x05] & 0xfffffffc;
16661697      if (base >= m_rambase.bytes() && base < 0x20000000)
1667         add_dynamic_device_address(ide, base + 0x0000, base + 0x0003, ide_alt_r, ide_alt_w);
1698         add_dynamic_address(base + 0x0000, base + 0x0003, read32_delegate(FUNC(vegas_state::ide_alt_r), this), write32_delegate(FUNC(vegas_state::ide_alt_w), this));
16681699
16691700      base = m_pci_ide_regs[0x08] & 0xfffffff0;
16701701      if (base >= m_rambase.bytes() && base < 0x20000000)
1671         add_dynamic_device_address(ide, base + 0x0000, base + 0x0007, ide_bus_master32_r, ide_bus_master32_w);
1702         add_dynamic_address(base + 0x0000, base + 0x0007, read32_delegate(FUNC(vegas_state::ide_bus_master32_r), this), write32_delegate(FUNC(vegas_state::ide_bus_master32_w), this));
16721703
16731704      /* 3dfx card */
16741705      base = m_pci_3dfx_regs[0x04] & 0xfffffff0;
16751706      if (base >= m_rambase.bytes() && base < 0x20000000)
16761707      {
16771708         if (voodoo_type == TYPE_VOODOO_2)
1678            add_dynamic_device_address(m_voodoo, base + 0x000000, base + 0xffffff, voodoo_r, voodoo_w);
1709            add_legacy_dynamic_device_address(m_voodoo, base + 0x000000, base + 0xffffff, voodoo_r, voodoo_w);
16791710         else
1680            add_dynamic_device_address(m_voodoo, base + 0x000000, base + 0x1ffffff, banshee_r, banshee_w);
1711            add_legacy_dynamic_device_address(m_voodoo, base + 0x000000, base + 0x1ffffff, banshee_r, banshee_w);
16811712      }
16821713
16831714      if (voodoo_type >= TYPE_VOODOO_BANSHEE)
16841715      {
16851716         base = m_pci_3dfx_regs[0x05] & 0xfffffff0;
16861717         if (base >= m_rambase.bytes() && base < 0x20000000)
1687            add_dynamic_device_address(m_voodoo, base + 0x0000000, base + 0x1ffffff, banshee_fb_r, banshee_fb_w);
1718            add_legacy_dynamic_device_address(m_voodoo, base + 0x0000000, base + 0x1ffffff, banshee_fb_r, banshee_fb_w);
16881719
16891720         base = m_pci_3dfx_regs[0x06] & 0xfffffff0;
16901721         if (base >= m_rambase.bytes() && base < 0x20000000)
1691            add_dynamic_device_address(m_voodoo, base + 0x0000000, base + 0x00000ff, banshee_io_r, banshee_io_w);
1722            add_legacy_dynamic_device_address(m_voodoo, base + 0x0000000, base + 0x00000ff, banshee_io_r, banshee_io_w);
16921723
16931724         base = m_pci_3dfx_regs[0x0c] & 0xffff0000;
16941725         if (base >= m_rambase.bytes() && base < 0x20000000)
1695            add_dynamic_device_address(m_voodoo, base + 0x0000000, base + 0x000ffff, banshee_rom_r, NULL);
1726            add_legacy_dynamic_device_address(m_voodoo, base + 0x0000000, base + 0x000ffff, banshee_rom_r, NULL);
16961727      }
16971728   }
16981729
r26364r26365
17011732   address_space &space = m_maincpu->space(AS_PROGRAM);
17021733   for (addr = 0; addr < m_dynamic_count; addr++)
17031734   {
1704      if (LOG_DYNAMIC) logerror("  installing: %08X-%08X %s,%s\n", dynamic[addr].start, dynamic[addr].end, dynamic[addr].rdname, dynamic[addr].wrname);
1735      if (LOG_DYNAMIC) logerror("  installing: %08X-%08X \n", dynamic[addr].start, dynamic[addr].end);
17051736
1706      if (dynamic[addr].mread == NOP_HANDLER)
1737      if (dynamic[addr].read == NOP_HANDLER)
17071738         space.nop_read(dynamic[addr].start, dynamic[addr].end);
1708      else if (dynamic[addr].mread != NULL)
1709         space.install_legacy_read_handler(dynamic[addr].start, dynamic[addr].end, 0, 0, dynamic[addr].mread, dynamic[addr].rdname);
1710      if (dynamic[addr].mwrite != NULL)
1711         space.install_legacy_write_handler(dynamic[addr].start, dynamic[addr].end, 0, 0, dynamic[addr].mwrite, dynamic[addr].wrname);
1739      else if (!dynamic[addr].read.isnull())
1740         space.install_read_handler(dynamic[addr].start, dynamic[addr].end, 0, 0, dynamic[addr].read);
1741      if (!dynamic[addr].write.isnull())
1742         space.install_write_handler(dynamic[addr].start, dynamic[addr].end, 0, 0, dynamic[addr].write);
1743   }
1744   
1745   for (l_addr = 0; l_addr < m_legacy_dynamic_count; l_addr++)
1746   {
1747      if (LOG_DYNAMIC) logerror("  installing: %08X-%08X %s,%s\n", l_dynamic[l_addr].start, l_dynamic[l_addr].end, l_dynamic[l_addr].rdname, l_dynamic[l_addr].wrname);
17121748
1713      if (dynamic[addr].dread != NULL || dynamic[addr].dwrite != NULL)
1714         space.install_legacy_readwrite_handler(*dynamic[addr].device, dynamic[addr].start, dynamic[addr].end, 0, 0, dynamic[addr].dread, dynamic[addr].rdname, dynamic[addr].dwrite, dynamic[addr].wrname);
1749      if (l_dynamic[l_addr].mread != NULL)
1750         space.install_legacy_read_handler(l_dynamic[l_addr].start, l_dynamic[l_addr].end, 0, 0, l_dynamic[l_addr].mread, l_dynamic[l_addr].rdname);
1751      if (l_dynamic[l_addr].mwrite != NULL)
1752         space.install_legacy_write_handler(l_dynamic[l_addr].start, l_dynamic[l_addr].end, 0, 0, l_dynamic[l_addr].mwrite, l_dynamic[l_addr].wrname);
1753
1754      if (l_dynamic[l_addr].dread != NULL || l_dynamic[l_addr].dwrite != NULL)
1755         space.install_legacy_readwrite_handler(*l_dynamic[l_addr].device, l_dynamic[l_addr].start, l_dynamic[l_addr].end, 0, 0, l_dynamic[l_addr].dread, l_dynamic[l_addr].rdname, l_dynamic[l_addr].dwrite, l_dynamic[l_addr].wrname);
17151756   }
17161757
17171758   if (LOG_DYNAMIC)
r26364r26365
17321773static ADDRESS_MAP_START( vegas_map_8mb, AS_PROGRAM, 32, vegas_state )
17331774   ADDRESS_MAP_UNMAP_HIGH
17341775   AM_RANGE(0x00000000, 0x007fffff) AM_RAM AM_SHARE("rambase")
1735   AM_RANGE(0x1fa00000, 0x1fa00fff) AM_READWRITE_LEGACY(nile_r, nile_w) AM_SHARE("nile_regs")
1776   AM_RANGE(0x1fa00000, 0x1fa00fff) AM_READWRITE(nile_r, nile_w) AM_SHARE("nile_regs")
17361777   AM_RANGE(0x1fc00000, 0x1fc7ffff) AM_ROM AM_REGION("user1", 0) AM_SHARE("rombase")
17371778ADDRESS_MAP_END
17381779
r26364r26365
17401781static ADDRESS_MAP_START( vegas_map_32mb, AS_PROGRAM, 32, vegas_state )
17411782   ADDRESS_MAP_UNMAP_HIGH
17421783   AM_RANGE(0x00000000, 0x01ffffff) AM_RAM AM_SHARE("rambase")
1743   AM_RANGE(0x1fa00000, 0x1fa00fff) AM_READWRITE_LEGACY(nile_r, nile_w) AM_SHARE("nile_regs")
1784   AM_RANGE(0x1fa00000, 0x1fa00fff) AM_READWRITE(nile_r, nile_w) AM_SHARE("nile_regs")
17441785   AM_RANGE(0x1fc00000, 0x1fc7ffff) AM_ROM AM_REGION("user1", 0) AM_SHARE("rombase")
17451786ADDRESS_MAP_END
17461787

Previous 199869 Revisions Next


© 1997-2024 The MAME Team