Previous 199869 Revisions Next

r20892 Sunday 10th February, 2013 at 14:16:16 UTC by Wilbert Pol
neogeo.c/ng_aes.c: Reduce tagmap lookups (nw)
[src/mame/drivers]neogeo.c
[src/mame/includes]neogeo.h
[src/mame/machine]neoboot.c neoprot.c
[src/mame/video]neogeo.c
[src/mess/drivers]ng_aes.c

trunk/src/mess/drivers/ng_aes.c
r20891r20892
178178   DECLARE_DRIVER_INIT(neocdzj);
179179
180180   IRQ_CALLBACK_MEMBER(neocd_int_callback);
181
182protected:
183   void common_machine_start();
181184};
182185
183186
r20891r20892
456459            // writes 00 / 01 / ff
457460            printf("MapVectorTable? %04x %04x\n",data,mem_mask);
458461
459            if (!data) neogeo_set_main_cpu_vector_table_source(machine(), 0); // bios vectors
460            else neogeo_set_main_cpu_vector_table_source(machine(), 1); // ram (aka cart) vectors
462            if (!data) neogeo_set_main_cpu_vector_table_source(0); // bios vectors
463            else neogeo_set_main_cpu_vector_table_source(1); // ram (aka cart) vectors
461464
462465         }
463466
r20891r20892
10371040 *************************************/
10381041
10391042
1040static void common_machine_start(running_machine &machine)
1043void ng_aes_state::common_machine_start()
10411044{
1042   neogeo_state *state = machine.driver_data<neogeo_state>();
1043
10441045   /* set the BIOS bank */
1045   state->membank(NEOGEO_BANK_BIOS)->set_base(state->memregion("mainbios")->base());
1046   m_bank_bios->set_base(memregion("mainbios")->base());
10461047
10471048   /* set the initial main CPU bank */
1048   neogeo_main_cpu_banking_init(machine);
1049   neogeo_main_cpu_banking_init();
10491050
10501051   /* set the initial audio CPU ROM banks */
1051   neogeo_audio_cpu_banking_init(machine);
1052   neogeo_audio_cpu_banking_init();
10521053
1053   state->create_interrupt_timers(machine);
1054   create_interrupt_timers();
10541055
10551056   /* irq levels for MVS / AES */
1056   state->m_vblank_level = 1;
1057   state->m_raster_level = 2;
1057   m_vblank_level = 1;
1058   m_raster_level = 2;
10581059
10591060   /* start with an IRQ3 - but NOT on a reset */
1060   state->m_irq3_pending = 1;
1061   m_irq3_pending = 1;
10611062
1062   /* get devices */
1063   state->m_maincpu = machine.device<cpu_device>("maincpu");
1064   state->m_audiocpu = machine.device<cpu_device>("audiocpu");
1065   state->m_upd4990a = machine.device("upd4990a");
1066
10671063   /* register state save */
1068   state->save_item(NAME(state->m_display_position_interrupt_control));
1069   state->save_item(NAME(state->m_display_counter));
1070   state->save_item(NAME(state->m_vblank_interrupt_pending));
1071   state->save_item(NAME(state->m_display_position_interrupt_pending));
1072   state->save_item(NAME(state->m_irq3_pending));
1073   state->save_item(NAME(state->m_audio_result));
1074   state->save_item(NAME(state->m_controller_select));
1075   state->save_item(NAME(state->m_main_cpu_bank_address));
1076   state->save_item(NAME(state->m_main_cpu_vector_table_source));
1077   state->save_item(NAME(state->m_audio_cpu_banks));
1078   state->save_item(NAME(state->m_audio_cpu_rom_source));
1079   state->save_item(NAME(state->m_audio_cpu_rom_source_last));
1080   state->save_item(NAME(state->m_save_ram_unlocked));
1081   state->save_item(NAME(state->m_output_data));
1082   state->save_item(NAME(state->m_output_latch));
1083   state->save_item(NAME(state->m_el_value));
1084   state->save_item(NAME(state->m_led1_value));
1085   state->save_item(NAME(state->m_led2_value));
1086   state->save_item(NAME(state->m_recurse));
1064   save_item(NAME(m_display_position_interrupt_control));
1065   save_item(NAME(m_display_counter));
1066   save_item(NAME(m_vblank_interrupt_pending));
1067   save_item(NAME(m_display_position_interrupt_pending));
1068   save_item(NAME(m_irq3_pending));
1069   save_item(NAME(m_audio_result));
1070   save_item(NAME(m_controller_select));
1071   save_item(NAME(m_main_cpu_bank_address));
1072   save_item(NAME(m_main_cpu_vector_table_source));
1073   save_item(NAME(m_audio_cpu_banks));
1074   save_item(NAME(m_audio_cpu_rom_source));
1075   save_item(NAME(m_audio_cpu_rom_source_last));
1076   save_item(NAME(m_save_ram_unlocked));
1077   save_item(NAME(m_output_data));
1078   save_item(NAME(m_output_latch));
1079   save_item(NAME(m_el_value));
1080   save_item(NAME(m_led1_value));
1081   save_item(NAME(m_led2_value));
1082   save_item(NAME(m_recurse));
10871083
1088   machine.save().register_postload(save_prepost_delegate(FUNC(neogeo_state::neogeo_postload), state));
1084   machine().save().register_postload(save_prepost_delegate(FUNC(neogeo_state::neogeo_postload), this));
10891085}
10901086
10911087MACHINE_START_MEMBER(ng_aes_state,neogeo)
10921088{
1093   common_machine_start(machine());
1089   common_machine_start();
10941090   m_is_mvs = false;
10951091
10961092   /* initialize the memcard data structure */
r20891r20892
11031099   m_has_audio_banking = false;
11041100   m_is_cartsys = false;
11051101
1106   common_machine_start(machine());
1102   common_machine_start();
11071103   m_is_mvs = false;
11081104
11091105   /* irq levels for NEOCD (swapped compared to MVS / AES) */
r20891r20892
11171113   save_pointer(NAME(m_memcard_data), 0x2000);
11181114
11191115   // for custom vectors
1120   machine().device("maincpu")->execute().set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(ng_aes_state::neocd_int_callback),this));
1116   m_maincpu->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(ng_aes_state::neocd_int_callback),this));
11211117
1122   neogeo_set_main_cpu_vector_table_source(machine(), 0); // default to the BIOS vectors
1118   neogeo_set_main_cpu_vector_table_source(0); // default to the BIOS vectors
11231119
11241120   m_tempcdc->reset_cd();
11251121}
r20891r20892
11421138MACHINE_RESET_MEMBER(ng_aes_state,neogeo)
11431139{
11441140   offs_t offs;
1145   address_space &space = machine().device("maincpu")->memory().space(AS_PROGRAM);
1141   address_space &space = m_maincpu->space(AS_PROGRAM);
11461142
11471143   /* reset system control registers */
11481144   for (offs = 0; offs < 8; offs++)
11491145      system_control_w(space, offs, 0, 0x00ff);
11501146
1151   machine().device("maincpu")->reset();
1147   m_maincpu->reset();
11521148
11531149   neogeo_reset_rng(machine());
11541150
1155   start_interrupt_timers(machine());
1151   start_interrupt_timers();
11561152
11571153   /* trigger the IRQ3 that was set by MACHINE_START */
1158   update_interrupts(machine());
1154   update_interrupts();
11591155
11601156   m_recurse = 0;
11611157
r20891r20892
15821578      if ((nIRQAcknowledge & 0x08) == 0) {
15831579         nNeoCDIRQVector = 0x17;
15841580         nNeoCDIRQVectorAck = 1;
1585         machine().device("maincpu")->execute().set_input_line(4, HOLD_LINE);
1581         m_maincpu->set_input_line(4, HOLD_LINE);
15861582         return;
15871583      }
15881584      if ((nIRQAcknowledge & 0x10) == 0) {
15891585         nNeoCDIRQVector = 0x16;
15901586         nNeoCDIRQVectorAck = 1;
1591         machine().device("maincpu")->execute().set_input_line(4, HOLD_LINE);
1587         m_maincpu->set_input_line(4, HOLD_LINE);
15921588         return;
15931589      }
15941590      if ((nIRQAcknowledge & 0x20) == 0) {
15951591         nNeoCDIRQVector = 0x15;
15961592         nNeoCDIRQVectorAck = 1;
1597         machine().device("maincpu")->execute().set_input_line(4, HOLD_LINE);
1593         m_maincpu->set_input_line(4, HOLD_LINE);
15981594         return;
15991595      }
16001596   }
trunk/src/mame/machine/neoboot.c
r20891r20892
162162   UINT32 bank = 0x100000 + ((nBank & 7) << 20);
163163   if (bank >= 0x700000)
164164      bank = 0x100000;
165   neogeo_set_main_cpu_bank_address(space, bank);
165   space.machine().driver_data<neogeo_state>()->neogeo_set_main_cpu_bank_address(bank);
166166}
167167
168168static READ16_HANDLER( kof10th_RAMB_r )
r20891r20892
492492   if (offset == 0)
493493   {
494494      bankaddress = 0x100000 + cthd2003_banks[data&7]*0x100000;
495      neogeo_set_main_cpu_bank_address(space, bankaddress);
495      space.machine().driver_data<neogeo_state>()->neogeo_set_main_cpu_bank_address(bankaddress);
496496   }
497497}
498498
r20891r20892
731731   if ((offset == 0)&&(data == 0xa0))
732732   {
733733      bankaddress=0xa0;
734      neogeo_set_main_cpu_bank_address(space, bankaddress);
734      space.machine().driver_data<neogeo_state>()->neogeo_set_main_cpu_bank_address(bankaddress);
735735      logerror("offset: %06x PC %06x: set banking %04x\n\n",offset,space.device().safe_pc(),bankaddress);
736736   }
737737   else if(offset == 2)
r20891r20892
739739      data=data>>4;
740740      //data=data&7;
741741      bankaddress=data*0x100000;
742      neogeo_set_main_cpu_bank_address(space, bankaddress);
742      space.machine().driver_data<neogeo_state>()->neogeo_set_main_cpu_bank_address(bankaddress);
743743      logerror("offset: %06x PC %06x: set banking %04x\n\n",offset,space.device().safe_pc(),bankaddress);
744744   }
745745}
r20891r20892
920920{
921921   UINT32 bankaddress = (mv0_bank_ram[ 0 ] >> 8) + (mv0_bank_ram[ 1 ] << 8) + 0x100000;
922922   COMBINE_DATA( &mv0_bank_ram[ offset ] );
923   neogeo_set_main_cpu_bank_address( space, bankaddress );
923   space.machine().driver_data<neogeo_state>()->neogeo_set_main_cpu_bank_address( bankaddress );
924924}
925925#endif
926926
r20891r20892
947947      cr[BYTE_XOR_LE(0x1ff0)] =  0xa0;
948948      cr[BYTE_XOR_LE(0x1ff1)] &= 0xfe;
949949      cr[BYTE_XOR_LE(0x1ff3)] &= 0x7f;
950      neogeo_set_main_cpu_bank_address(space, address+0x100000);
950      space.machine().driver_data<neogeo_state>()->neogeo_set_main_cpu_bank_address(address+0x100000);
951951
952952      mem[BYTE_XOR_LE(0x58196)] = prt;
953953   }
r20891r20892
964964
965965      cr[BYTE_XOR_LE(0x1ff0)] &= 0xfe;
966966      cr[BYTE_XOR_LE(0x1ff3)] &= 0x7f;
967      neogeo_set_main_cpu_bank_address(space, address+0x100000);
967      space.machine().driver_data<neogeo_state>()->neogeo_set_main_cpu_bank_address(address+0x100000);
968968
969969      mem[BYTE_XOR_LE(0x58196)] = prt;
970970   }
trunk/src/mame/machine/neoprot.c
r20891r20892
257257
258258   bankaddress = 0x100000 + bankoffset[data];
259259
260   neogeo_set_main_cpu_bank_address(space, bankaddress);
260   space.machine().driver_data<neogeo_state>()->neogeo_set_main_cpu_bank_address(bankaddress);
261261}
262262
263263
r20891r20892
294294
295295   bankaddress = 0x100000 + bankoffset[data];
296296
297   neogeo_set_main_cpu_bank_address(space, bankaddress);
297   space.machine().driver_data<neogeo_state>()->neogeo_set_main_cpu_bank_address(bankaddress);
298298}
299299
300300
r20891r20892
333333
334334   bankaddress = 0x100000 + bankoffset[data];
335335
336   neogeo_set_main_cpu_bank_address(space, bankaddress);
336   space.machine().driver_data<neogeo_state>()->neogeo_set_main_cpu_bank_address(bankaddress);
337337}
338338
339339
r20891r20892
369369
370370   bankaddress = 0x100000 + bankoffset[data];
371371
372   neogeo_set_main_cpu_bank_address(space, bankaddress);
372   space.machine().driver_data<neogeo_state>()->neogeo_set_main_cpu_bank_address(bankaddress);
373373}
374374
375375
r20891r20892
401401
402402   bankaddress = 0x100000 + bankoffset[data];
403403
404   neogeo_set_main_cpu_bank_address(space, bankaddress);
404   space.machine().driver_data<neogeo_state>()->neogeo_set_main_cpu_bank_address(bankaddress);
405405}
406406
407407
r20891r20892
550550   *(((UINT8 *)state->m_pvc_cartridge_ram) + BYTE_XOR_LE(0x1ff0)) = 0xa0;
551551   *(((UINT8 *)state->m_pvc_cartridge_ram) + BYTE_XOR_LE(0x1ff1)) &= 0xfe;
552552   *(((UINT8 *)state->m_pvc_cartridge_ram) + BYTE_XOR_LE(0x1ff3)) &= 0x7f;
553   neogeo_set_main_cpu_bank_address(space, bankaddress + 0x100000);
553   state->neogeo_set_main_cpu_bank_address(bankaddress + 0x100000);
554554}
555555
556556
trunk/src/mame/includes/neogeo.h
r20891r20892
3636{
3737public:
3838   neogeo_state(const machine_config &mconfig, device_type type, const char *tag)
39      : driver_device(mconfig, type, tag),
40      m_save_ram(*this, "save_ram")
39      : driver_device(mconfig, type, tag)
40      , m_save_ram(*this, "save_ram")
41      , m_maincpu(*this, "maincpu")
42      , m_audiocpu(*this, "audiocpu")
43      , m_upd4990a(*this, "upd4990a")
44      , m_region_maincpu(*this, "maincpu")
45      , m_bank_vectors(*this, NEOGEO_BANK_VECTORS)
46      , m_bank_bios(*this, NEOGEO_BANK_BIOS)
47      , m_bank_cartridge(*this, NEOGEO_BANK_CARTRIDGE)
48      , m_bank_audio_main(*this, NEOGEO_BANK_AUDIO_CPU_MAIN_BANK)
4149   {
4250      m_has_audio_banking = true;
4351      m_is_mvs = true;
r20891r20892
4654      m_has_text_bus = true;
4755      m_has_ymrom_bus = true;
4856      m_has_z80_bus = true;
57      m_bank_audio_cart[0] = NULL;
58      m_bank_audio_cart[1] = NULL;
59      m_bank_audio_cart[2] = NULL;
60      m_bank_audio_cart[3] = NULL;
4961   }
5062
5163   /* memory pointers */
r20891r20892
124136   UINT16     m_mslugx_command;
125137
126138   /* devices */
127   cpu_device *m_maincpu;
128   cpu_device *m_audiocpu;
129   device_t *m_upd4990a;
139   required_device<cpu_device> m_maincpu;
140   required_device<cpu_device> m_audiocpu;
141   required_device<device_t> m_upd4990a;
142
130143   DECLARE_WRITE8_MEMBER(audio_cpu_clear_nmi_w);
131144   DECLARE_WRITE16_MEMBER(io_control_w);
132145   DECLARE_WRITE16_MEMBER(save_ram_w);
r20891r20892
223236   virtual void video_start();
224237   virtual void video_reset();
225238   UINT32 screen_update_neogeo(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
226   void update_interrupts( running_machine &machine );
227   void create_interrupt_timers( running_machine &machine );
228   void start_interrupt_timers( running_machine &machine );
239   void update_interrupts();
240   void create_interrupt_timers();
241   void start_interrupt_timers();
229242   TIMER_CALLBACK_MEMBER(display_position_interrupt_callback);
230243   TIMER_CALLBACK_MEMBER(display_position_vblank_callback);
231244   TIMER_CALLBACK_MEMBER(vblank_interrupt_callback);
r20891r20892
244257   bool m_has_text_bus;
245258   bool m_has_ymrom_bus;
246259   bool m_has_z80_bus;
260
261   void neogeo_set_main_cpu_bank_address( UINT32 bank_address );
262
263protected:
264   required_memory_region m_region_maincpu;
265   required_memory_bank m_bank_vectors;
266   required_memory_bank m_bank_bios;
267   optional_memory_bank m_bank_cartridge;  // optional because of neocd
268   optional_memory_bank m_bank_audio_main; // optional because of neocd
269   memory_bank *m_bank_audio_cart[4];
270
271   void neogeo_acknowledge_interrupt(UINT16 data);
272   void _set_main_cpu_bank_address();
273   void neogeo_main_cpu_banking_init();
274   void neogeo_audio_cpu_banking_init();
275   void set_audio_cpu_banking();
276   void audio_cpu_bank_select( int region, UINT8 bank );
277   void adjust_display_position_interrupt_timer();
278   void neogeo_set_display_position_interrupt_control(UINT16 data);
279   void neogeo_set_display_counter_msb(UINT16 data);
280   void neogeo_set_display_counter_lsb(UINT16 data);
281   void neogeo_set_main_cpu_vector_table_source( UINT8 data );
282   void set_video_control( UINT16 data );
283   void _set_audio_cpu_rom_source();
284   void set_audio_cpu_rom_source( UINT8 data );
285   void _set_main_cpu_vector_table_source();
247286};
248287
249288
250289/*----------- defined in drivers/neogeo.c -----------*/
251290
252291MACHINE_CONFIG_EXTERN( neogeo_base );
253void neogeo_set_display_position_interrupt_control(running_machine &machine, UINT16 data);
254void neogeo_set_display_counter_msb(address_space &space, UINT16 data);
255void neogeo_set_display_counter_lsb(address_space &space, UINT16 data);
256void neogeo_acknowledge_interrupt(running_machine &machine, UINT16 data);
257void neogeo_set_main_cpu_bank_address(address_space &space, UINT32 bank_address);
258void neogeo_audio_cpu_banking_init( running_machine &machine );
259void neogeo_main_cpu_banking_init( running_machine &machine );
260void neogeo_set_main_cpu_vector_table_source( running_machine &machine, UINT8 data );
261292
262293/*----------- defined in machine/neocrypt.c -----------*/
263294
trunk/src/mame/video/neogeo.c
r20891r20892
776776}
777777
778778
779static void set_video_control( running_machine &machine, UINT16 data )
779void neogeo_state::set_video_control( UINT16 data )
780780{
781781   /* this does much more than this, but I'm not sure exactly what */
782   if (VERBOSE) logerror("%s: video control write %04x\n", machine.describe_context(), data);
782   if (VERBOSE) logerror("%s: video control write %04x\n", machine().describe_context(), data);
783783
784   set_auto_animation_speed(machine, data >> 8);
785   set_auto_animation_disabled(machine, data & 0x0008);
784   set_auto_animation_speed(machine(), data >> 8);
785   set_auto_animation_disabled(machine(), data & 0x0008);
786786
787   neogeo_set_display_position_interrupt_control(machine, data & 0x00f0);
787   neogeo_set_display_position_interrupt_control(data & 0x00f0);
788788}
789789
790790
r20891r20892
825825      case 0x00: set_videoram_offset(machine(), data); break;
826826      case 0x01: set_videoram_data(machine(), data); break;
827827      case 0x02: set_videoram_modulo(machine(), data); break;
828      case 0x03: set_video_control(machine(), data); break;
829      case 0x04: neogeo_set_display_counter_msb(space, data); break;
830      case 0x05: neogeo_set_display_counter_lsb(space, data); break;
831      case 0x06: neogeo_acknowledge_interrupt(machine(), data); break;
828      case 0x03: set_video_control(data); break;
829      case 0x04: neogeo_set_display_counter_msb(data); break;
830      case 0x05: neogeo_set_display_counter_lsb(data); break;
831      case 0x06: neogeo_acknowledge_interrupt(data); break;
832832      case 0x07: break; /* unknown, see get_video_control */
833833      }
834834   }
trunk/src/mame/drivers/neogeo.c
r20891r20892
196196#define IRQ2CTRL_AUTOLOAD_REPEAT    (0x80)
197197
198198
199static void adjust_display_position_interrupt_timer( running_machine &machine )
199void neogeo_state::adjust_display_position_interrupt_timer()
200200{
201   neogeo_state *state = machine.driver_data<neogeo_state>();
202
203   if ((state->m_display_counter + 1) != 0)
201   if ((m_display_counter + 1) != 0)
204202   {
205      attotime period = attotime::from_hz(NEOGEO_PIXEL_CLOCK) * (state->m_display_counter + 1);
206      if (LOG_VIDEO_SYSTEM) logerror("adjust_display_position_interrupt_timer  current y: %02x  current x: %02x   target y: %x  target x: %x\n", machine.primary_screen->vpos(), machine.primary_screen->hpos(), (state->m_display_counter + 1) / NEOGEO_HTOTAL, (state->m_display_counter + 1) % NEOGEO_HTOTAL);
203      attotime period = attotime::from_hz(NEOGEO_PIXEL_CLOCK) * (m_display_counter + 1);
204      if (LOG_VIDEO_SYSTEM) logerror("adjust_display_position_interrupt_timer  current y: %02x  current x: %02x   target y: %x  target x: %x\n", machine().primary_screen->vpos(), machine().primary_screen->hpos(), (m_display_counter + 1) / NEOGEO_HTOTAL, (m_display_counter + 1) % NEOGEO_HTOTAL);
207205
208      state->m_display_position_interrupt_timer->adjust(period);
206      m_display_position_interrupt_timer->adjust(period);
209207   }
210208}
211209
212210
213void neogeo_set_display_position_interrupt_control( running_machine &machine, UINT16 data )
211void neogeo_state::neogeo_set_display_position_interrupt_control( UINT16 data )
214212{
215   neogeo_state *state = machine.driver_data<neogeo_state>();
216   state->m_display_position_interrupt_control = data;
213   m_display_position_interrupt_control = data;
217214}
218215
219216
220void neogeo_set_display_counter_msb( address_space &space, UINT16 data )
217void neogeo_state::neogeo_set_display_counter_msb( UINT16 data )
221218{
222   neogeo_state *state = space.machine().driver_data<neogeo_state>();
219   m_display_counter = (m_display_counter & 0x0000ffff) | ((UINT32)data << 16);
223220
224   state->m_display_counter = (state->m_display_counter & 0x0000ffff) | ((UINT32)data << 16);
225
226   if (LOG_VIDEO_SYSTEM) logerror("PC %06x: set_display_counter %08x\n", space.device().safe_pc(), state->m_display_counter);
221   if (LOG_VIDEO_SYSTEM) logerror("PC %06x: set_display_counter %08x\n", m_maincpu->pc(), m_display_counter);
227222}
228223
229224
230void neogeo_set_display_counter_lsb( address_space &space, UINT16 data )
225void neogeo_state::neogeo_set_display_counter_lsb( UINT16 data )
231226{
232   neogeo_state *state = space.machine().driver_data<neogeo_state>();
227   m_display_counter = (m_display_counter & 0xffff0000) | data;
233228
234   state->m_display_counter = (state->m_display_counter & 0xffff0000) | data;
229   if (LOG_VIDEO_SYSTEM) logerror("PC %06x: set_display_counter %08x\n", m_maincpu->pc(), m_display_counter);
235230
236   if (LOG_VIDEO_SYSTEM) logerror("PC %06x: set_display_counter %08x\n", space.device().safe_pc(), state->m_display_counter);
237
238   if (state->m_display_position_interrupt_control & IRQ2CTRL_LOAD_RELATIVE)
231   if (m_display_position_interrupt_control & IRQ2CTRL_LOAD_RELATIVE)
239232   {
240233      if (LOG_VIDEO_SYSTEM) logerror("AUTOLOAD_RELATIVE ");
241      adjust_display_position_interrupt_timer(space.machine());
234      adjust_display_position_interrupt_timer();
242235   }
243236}
244237
245238
246void neogeo_state::update_interrupts( running_machine &machine )
239void neogeo_state::update_interrupts()
247240{
248   neogeo_state *state = machine.driver_data<neogeo_state>();
249
250   machine.device("maincpu")->execute().set_input_line(state->m_vblank_level, state->m_vblank_interrupt_pending ? ASSERT_LINE : CLEAR_LINE);
251   machine.device("maincpu")->execute().set_input_line(state->m_raster_level, state->m_display_position_interrupt_pending ? ASSERT_LINE : CLEAR_LINE);
252   machine.device("maincpu")->execute().set_input_line(3, state->m_irq3_pending ? ASSERT_LINE : CLEAR_LINE);
241   m_maincpu->set_input_line(m_vblank_level, m_vblank_interrupt_pending ? ASSERT_LINE : CLEAR_LINE);
242   m_maincpu->set_input_line(m_raster_level, m_display_position_interrupt_pending ? ASSERT_LINE : CLEAR_LINE);
243   m_maincpu->set_input_line(3, m_irq3_pending ? ASSERT_LINE : CLEAR_LINE);
253244}
254245
255246
256void neogeo_acknowledge_interrupt( running_machine &machine, UINT16 data )
247void neogeo_state::neogeo_acknowledge_interrupt( UINT16 data )
257248{
258   neogeo_state *state = machine.driver_data<neogeo_state>();
259
260249   if (data & 0x01)
261      state->m_irq3_pending = 0;
250      m_irq3_pending = 0;
262251   if (data & 0x02)
263      state->m_display_position_interrupt_pending = 0;
252      m_display_position_interrupt_pending = 0;
264253   if (data & 0x04)
265      state->m_vblank_interrupt_pending = 0;
254      m_vblank_interrupt_pending = 0;
266255
267   state->update_interrupts(machine);
256   update_interrupts();
268257}
269258
270259
r20891r20892
277266      if (LOG_VIDEO_SYSTEM) logerror("*** Scanline interrupt (IRQ2) ***  y: %02x  x: %02x\n", machine().primary_screen->vpos(), machine().primary_screen->hpos());
278267      m_display_position_interrupt_pending = 1;
279268
280      update_interrupts(machine());
269      update_interrupts();
281270   }
282271
283272   if (m_display_position_interrupt_control & IRQ2CTRL_AUTOLOAD_REPEAT)
284273   {
285274      if (LOG_VIDEO_SYSTEM) logerror("AUTOLOAD_REPEAT ");
286      adjust_display_position_interrupt_timer(machine());
275      adjust_display_position_interrupt_timer();
287276   }
288277}
289278
r20891r20892
293282   if (m_display_position_interrupt_control & IRQ2CTRL_AUTOLOAD_VBLANK)
294283   {
295284      if (LOG_VIDEO_SYSTEM) logerror("AUTOLOAD_VBLANK ");
296      adjust_display_position_interrupt_timer(machine());
285      adjust_display_position_interrupt_timer();
297286   }
298287
299288   /* set timer for next screen */
r20891r20892
310299
311300   m_vblank_interrupt_pending = 1;
312301
313   update_interrupts(machine());
302   update_interrupts();
314303
315304   /* set timer for next screen */
316305   m_vblank_interrupt_timer->adjust(machine().primary_screen->time_until_pos(NEOGEO_VBSTART));
317306}
318307
319308
320void neogeo_state::create_interrupt_timers( running_machine &machine )
309void neogeo_state::create_interrupt_timers()
321310{
322   neogeo_state *state = machine.driver_data<neogeo_state>();
323   state->m_display_position_interrupt_timer = machine.scheduler().timer_alloc(timer_expired_delegate(FUNC(neogeo_state::display_position_interrupt_callback),state));
324   state->m_display_position_vblank_timer = machine.scheduler().timer_alloc(timer_expired_delegate(FUNC(neogeo_state::display_position_vblank_callback),state));
325   state->m_vblank_interrupt_timer = machine.scheduler().timer_alloc(timer_expired_delegate(FUNC(neogeo_state::vblank_interrupt_callback),state));
311   m_display_position_interrupt_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(neogeo_state::display_position_interrupt_callback),this));
312   m_display_position_vblank_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(neogeo_state::display_position_vblank_callback),this));
313   m_vblank_interrupt_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(neogeo_state::vblank_interrupt_callback),this));
326314}
327315
328316
329void neogeo_state::start_interrupt_timers( running_machine &machine )
317void neogeo_state::start_interrupt_timers()
330318{
331   neogeo_state *state = machine.driver_data<neogeo_state>();
332   state->m_vblank_interrupt_timer->adjust(machine.primary_screen->time_until_pos(NEOGEO_VBSTART));
333   state->m_display_position_vblank_timer->adjust(machine.primary_screen->time_until_pos(NEOGEO_VBSTART, NEOGEO_VBLANK_RELOAD_HPOS));
319   m_vblank_interrupt_timer->adjust(machine().primary_screen->time_until_pos(NEOGEO_VBSTART));
320   m_display_position_vblank_timer->adjust(machine().primary_screen->time_until_pos(NEOGEO_VBSTART, NEOGEO_VBLANK_RELOAD_HPOS));
334321}
335322
336323
r20891r20892
607594{
608595   UINT32 ret = m_audio_result;
609596
610//  if (LOG_CPU_COMM) logerror("MAIN CPU PC %06x: audio_result_r %02x\n", machine().device("maincpu")->safe_pc(), ret);
597//  if (LOG_CPU_COMM) logerror("MAIN CPU PC %06x: audio_result_r %02x\n", m_maincpu->pc(), ret);
611598
612599   return ret;
613600}
r20891r20892
620607 *
621608 *************************************/
622609
623static void _set_main_cpu_vector_table_source( running_machine &machine )
610void neogeo_state::_set_main_cpu_vector_table_source()
624611{
625   neogeo_state *state = machine.driver_data<neogeo_state>();
626   state->membank(NEOGEO_BANK_VECTORS)->set_entry(state->m_main_cpu_vector_table_source);
612   m_bank_vectors->set_entry(m_main_cpu_vector_table_source);
627613}
628614
629615
630616
631void neogeo_set_main_cpu_vector_table_source( running_machine &machine, UINT8 data )
617void neogeo_state::neogeo_set_main_cpu_vector_table_source( UINT8 data )
632618{
633   neogeo_state *state = machine.driver_data<neogeo_state>();
634   state->m_main_cpu_vector_table_source = data;
619   m_main_cpu_vector_table_source = data;
635620
636   _set_main_cpu_vector_table_source(machine);
621   _set_main_cpu_vector_table_source();
637622}
638623
639624
640static void _set_main_cpu_bank_address( running_machine &machine )
625void neogeo_state::_set_main_cpu_bank_address()
641626{
642   neogeo_state *state = machine.driver_data<neogeo_state>();
643   if (!state->m_is_cartsys) return;
627   if (!m_is_cartsys) return;
644628
645   state->membank(NEOGEO_BANK_CARTRIDGE)->set_base(&state->memregion("maincpu")->base()[state->m_main_cpu_bank_address]);
629   m_bank_cartridge->set_base(m_region_maincpu->base() + m_main_cpu_bank_address);
646630}
647631
648632
649void neogeo_set_main_cpu_bank_address( address_space &space, UINT32 bank_address )
633void neogeo_state::neogeo_set_main_cpu_bank_address( UINT32 bank_address )
650634{
651   neogeo_state *state = space.machine().driver_data<neogeo_state>();
635   if (LOG_MAIN_CPU_BANKING) logerror("MAIN CPU PC %06x: neogeo_set_main_cpu_bank_address %06x\n", m_maincpu->pc(), bank_address);
652636
653   if (LOG_MAIN_CPU_BANKING) logerror("MAIN CPU PC %06x: neogeo_set_main_cpu_bank_address %06x\n", space.device().safe_pc(), bank_address);
637   m_main_cpu_bank_address = bank_address;
654638
655   state->m_main_cpu_bank_address = bank_address;
656
657   _set_main_cpu_bank_address(space.machine());
639   _set_main_cpu_bank_address();
658640}
659641
660642
r20891r20892
662644WRITE16_MEMBER(neogeo_state::main_cpu_bank_select_w)
663645{
664646   UINT32 bank_address;
665   UINT32 len = memregion("maincpu")->bytes();
647   UINT32 len = m_region_maincpu->bytes();
666648
667649   if ((len <= 0x100000) && (data & 0x07))
668650      logerror("PC %06x: warning: bankswitch to %02x but no banks available\n", space.device().safe_pc(), data);
r20891r20892
676658         bank_address = 0x100000;
677659      }
678660
679      neogeo_set_main_cpu_bank_address(space, bank_address);
661      neogeo_set_main_cpu_bank_address(bank_address);
680662   }
681663}
682664
683665
684666
685667
686void neogeo_main_cpu_banking_init( running_machine &machine )
668void neogeo_state::neogeo_main_cpu_banking_init()
687669{
688   neogeo_state *state = machine.driver_data<neogeo_state>();
689   address_space &mainspace = machine.device("maincpu")->memory().space(AS_PROGRAM);
690
691670   /* create vector banks */
692   state->membank(NEOGEO_BANK_VECTORS)->configure_entry(0, machine.root_device().memregion("mainbios")->base());
693   state->membank(NEOGEO_BANK_VECTORS)->configure_entry(1, machine.root_device().memregion("maincpu")->base());
671   m_bank_vectors->configure_entry(0, machine().root_device().memregion("mainbios")->base());
672   m_bank_vectors->configure_entry(1, m_region_maincpu->base());
694673
695   if (state->m_is_cartsys)
674   if (m_is_cartsys)
696675   {
697676      /* set initial main CPU bank */
698      if (machine.root_device().memregion("maincpu")->bytes() > 0x100000)
699         neogeo_set_main_cpu_bank_address(mainspace, 0x100000);
677      if (m_region_maincpu->bytes() > 0x100000)
678         neogeo_set_main_cpu_bank_address(0x100000);
700679      else
701         neogeo_set_main_cpu_bank_address(mainspace, 0x000000);
680         neogeo_set_main_cpu_bank_address(0x000000);
702681   }
703682}
704683
r20891r20892
709688 *
710689 *************************************/
711690
712static void set_audio_cpu_banking( running_machine &machine )
691void neogeo_state::set_audio_cpu_banking()
713692{
714   neogeo_state *state = machine.driver_data<neogeo_state>();
693   if (!m_has_audio_banking) return;
715694
716   if (!state->m_has_audio_banking) return;
717
718695   int region;
719696
720697   for (region = 0; region < 4; region++)
721      state->membank(audio_banks[region])->set_entry(state->m_audio_cpu_banks[region]);
698      m_bank_audio_cart[region]->set_entry(m_audio_cpu_banks[region]);
722699}
723700
724701
725702
726static void audio_cpu_bank_select( address_space &space, int region, UINT8 bank )
703void neogeo_state::audio_cpu_bank_select( int region, UINT8 bank )
727704{
728   neogeo_state *state = space.machine().driver_data<neogeo_state>();
705   if (!m_has_audio_banking) return;
729706
730   if (!state->m_has_audio_banking) return;
707   if (LOG_AUDIO_CPU_BANKING) logerror("Audio CPU PC %03x: audio_cpu_bank_select: Region: %d   Bank: %02x\n", m_audiocpu->pc(), region, bank);
731708
732   if (LOG_AUDIO_CPU_BANKING) logerror("Audio CPU PC %03x: audio_cpu_bank_select: Region: %d   Bank: %02x\n", space.device().safe_pc(), region, bank);
709   m_audio_cpu_banks[region] = bank;
733710
734   state->m_audio_cpu_banks[region] = bank;
735
736   set_audio_cpu_banking(space.machine());
711   set_audio_cpu_banking();
737712}
738713
739714
740715
741716READ8_MEMBER(neogeo_state::audio_cpu_bank_select_f000_f7ff_r)
742717{
743   audio_cpu_bank_select(space, 0, offset >> 8);
718   audio_cpu_bank_select(0, offset >> 8);
744719
745720   return 0;
746721}
r20891r20892
748723
749724READ8_MEMBER(neogeo_state::audio_cpu_bank_select_e000_efff_r)
750725{
751   audio_cpu_bank_select(space, 1, offset >> 8);
726   audio_cpu_bank_select(1, offset >> 8);
752727
753728   return 0;
754729}
r20891r20892
756731
757732READ8_MEMBER(neogeo_state::audio_cpu_bank_select_c000_dfff_r)
758733{
759   audio_cpu_bank_select(space, 2, offset >> 8);
734   audio_cpu_bank_select(2, offset >> 8);
760735
761736   return 0;
762737}
r20891r20892
764739
765740READ8_MEMBER(neogeo_state::audio_cpu_bank_select_8000_bfff_r)
766741{
767   audio_cpu_bank_select(space, 3, offset >> 8);
742   audio_cpu_bank_select(3, offset >> 8);
768743
769744   return 0;
770745}
771746
772747
773static void _set_audio_cpu_rom_source( address_space &space )
748void neogeo_state::_set_audio_cpu_rom_source()
774749{
775   neogeo_state *state = space.machine().driver_data<neogeo_state>();
776   if (!state->m_has_audio_banking) return;
750   if (!m_has_audio_banking) return;
777751
778/*  if (!state->memregion("audiobios")->base())   */
779      state->m_audio_cpu_rom_source = 1;
752/*  if (!memregion("audiobios")->base())   */
753      m_audio_cpu_rom_source = 1;
780754
781   state->membank(NEOGEO_BANK_AUDIO_CPU_MAIN_BANK)->set_entry(state->m_audio_cpu_rom_source);
755   m_bank_audio_main->set_entry(m_audio_cpu_rom_source);
782756
783757   /* reset CPU if the source changed -- this is a guess */
784   if (state->m_audio_cpu_rom_source != state->m_audio_cpu_rom_source_last)
758   if (m_audio_cpu_rom_source != m_audio_cpu_rom_source_last)
785759   {
786      state->m_audio_cpu_rom_source_last = state->m_audio_cpu_rom_source;
760      m_audio_cpu_rom_source_last = m_audio_cpu_rom_source;
787761
788      space.machine().device("audiocpu")->execute().set_input_line(INPUT_LINE_RESET, PULSE_LINE);
762      m_audiocpu->set_input_line(INPUT_LINE_RESET, PULSE_LINE);
789763
790      if (LOG_AUDIO_CPU_BANKING) logerror("Audio CPU PC %03x: selecting %s ROM\n", space.device().safe_pc(), state->m_audio_cpu_rom_source ? "CARTRIDGE" : "BIOS");
764      if (LOG_AUDIO_CPU_BANKING) logerror("Audio CPU PC %03x: selecting %s ROM\n", m_audiocpu->pc(), m_audio_cpu_rom_source ? "CARTRIDGE" : "BIOS");
791765   }
792766}
793767
794768
795769
796770
797static void set_audio_cpu_rom_source( address_space &space, UINT8 data )
771void neogeo_state::set_audio_cpu_rom_source( UINT8 data )
798772{
799   neogeo_state *state = space.machine().driver_data<neogeo_state>();
800   state->m_audio_cpu_rom_source = data;
801
802   _set_audio_cpu_rom_source(space);
773   m_audio_cpu_rom_source = data;
774   _set_audio_cpu_rom_source();
803775}
804776
805777
806778
807779
808780
809void neogeo_audio_cpu_banking_init( running_machine &machine )
781void neogeo_state::neogeo_audio_cpu_banking_init()
810782{
811   neogeo_state *state = machine.driver_data<neogeo_state>();
812   if (!state->m_has_audio_banking) return;
783   if (!m_has_audio_banking) return;
813784
814785   int region;
815786   int bank;
r20891r20892
817788   UINT32 address_mask;
818789
819790   /* audio bios/cartridge selection */
820   if (state->memregion("audiobios")->base())
821      state->membank(NEOGEO_BANK_AUDIO_CPU_MAIN_BANK)->configure_entry(0, state->memregion("audiobios")->base());
822   state->membank(NEOGEO_BANK_AUDIO_CPU_MAIN_BANK)->configure_entry(1, state->memregion("audiocpu")->base());
791   if (memregion("audiobios")->base())
792      m_bank_audio_main->configure_entry(0, memregion("audiobios")->base());
793   m_bank_audio_main->configure_entry(1, memregion("audiocpu")->base());
823794
824795   /* audio banking */
825   address_mask = state->memregion("audiocpu")->bytes() - 0x10000 - 1;
796   address_mask = memregion("audiocpu")->bytes() - 0x10000 - 1;
826797
827   rgn = state->memregion("audiocpu")->base();
798   rgn = memregion("audiocpu")->base();
828799   for (region = 0; region < 4; region++)
829800   {
801      m_bank_audio_cart[region] = membank(audio_banks[region]);
830802      for (bank = 0; bank < 0x100; bank++)
831803      {
832804         UINT32 bank_address = 0x10000 + (((bank << (11 + region)) & 0x3ffff) & address_mask);
833         state->membank(audio_banks[region])->configure_entry(bank, &rgn[bank_address]);
805         m_bank_audio_cart[region]->configure_entry(bank, &rgn[bank_address]);
834806      }
835807   }
836808
837809   /* set initial audio banks --
838810      how does this really work, or is it even necessary? */
839   state->m_audio_cpu_banks[0] = 0x1e;
840   state->m_audio_cpu_banks[1] = 0x0e;
841   state->m_audio_cpu_banks[2] = 0x06;
842   state->m_audio_cpu_banks[3] = 0x02;
811   m_audio_cpu_banks[0] = 0x1e;
812   m_audio_cpu_banks[1] = 0x0e;
813   m_audio_cpu_banks[2] = 0x06;
814   m_audio_cpu_banks[3] = 0x02;
843815
844   set_audio_cpu_banking(machine);
816   set_audio_cpu_banking();
845817
846   state->m_audio_cpu_rom_source_last = 0;
847   set_audio_cpu_rom_source(machine.device("maincpu")->memory().space(AS_PROGRAM), 0);
818   m_audio_cpu_rom_source_last = 0;
819   set_audio_cpu_rom_source(0);
848820}
849821
850822
r20891r20892
870842      case 0x01:
871843               if (m_is_cartsys)
872844               {
873                  neogeo_set_main_cpu_vector_table_source(machine(), bit); // NeoCD maps the vector swap elsewhere
845                  neogeo_set_main_cpu_vector_table_source(bit); // NeoCD maps the vector swap elsewhere
874846               }
875847               else
876848               {
r20891r20892
878850                  if (bit)
879851                  {
880852                     if (m_main_cpu_vector_table_source)
881                        neogeo_set_main_cpu_vector_table_source(machine(), 0);
853                        neogeo_set_main_cpu_vector_table_source(0);
882854                     else
883                        neogeo_set_main_cpu_vector_table_source(machine(), 1);
855                        neogeo_set_main_cpu_vector_table_source(1);
884856                  }
885857#endif
886858                  printf("NeoCD: write to regular vector change address? %d\n", bit); // what IS going on with "neocdz doubledr" and why do games write here if it's hooked up to nothing?
887859               }
888               if (m_has_audio_banking) set_audio_cpu_rom_source(space, bit); /* this is a guess */
860               if (m_has_audio_banking) set_audio_cpu_rom_source(bit); /* this is a guess */
889861               break;
890862      case 0x05: neogeo_set_fixed_layer_source(machine(), bit); break;
891863      case 0x06: if (m_is_mvs) set_save_ram_unlock(machine(), bit); break;
r20891r20892
1015987
1016988void neogeo_state::neogeo_postload()
1017989{
1018   _set_main_cpu_bank_address(machine());
1019   _set_main_cpu_vector_table_source(machine());
1020   set_audio_cpu_banking(machine());
1021   _set_audio_cpu_rom_source(machine().device("maincpu")->memory().space(AS_PROGRAM));
990   _set_main_cpu_bank_address();
991   _set_main_cpu_vector_table_source();
992   set_audio_cpu_banking();
993   _set_audio_cpu_rom_source();
1022994   if (m_is_mvs) set_outputs(machine());
1023995}
1024996
r20891r20892
10331005   machine().device<nvram_device>("saveram")->set_base(m_save_ram, 0x10000);
10341006
10351007   /* set the BIOS bank */
1036   membank(NEOGEO_BANK_BIOS)->set_base(memregion("mainbios")->base());
1008   m_bank_bios->set_base(memregion("mainbios")->base());
10371009
10381010   /* set the initial main CPU bank */
1039   neogeo_main_cpu_banking_init(machine());
1011   neogeo_main_cpu_banking_init();
10401012
10411013   /* set the initial audio CPU ROM banks */
1042   neogeo_audio_cpu_banking_init(machine());
1014   neogeo_audio_cpu_banking_init();
10431015
1044   create_interrupt_timers(machine());
1016   create_interrupt_timers();
10451017
10461018   /* initialize the memcard data structure */
10471019   memcard_data = auto_alloc_array_clear(machine(), UINT8, MEMCARD_SIZE);
r20891r20892
10531025   /* start with an IRQ3 - but NOT on a reset */
10541026   m_irq3_pending = 1;
10551027
1056   /* get devices */
1057   m_maincpu = machine().device<cpu_device>("maincpu");
1058   m_audiocpu = machine().device<cpu_device>("audiocpu");
1059   m_upd4990a = machine().device("upd4990a");
1060
10611028   /* register state save */
10621029   save_item(NAME(m_display_position_interrupt_control));
10631030   save_item(NAME(m_display_counter));
r20891r20892
10941061void neogeo_state::machine_reset()
10951062{
10961063   offs_t offs;
1097   address_space &space = machine().device("maincpu")->memory().space(AS_PROGRAM);
1064   address_space &space = m_maincpu->space(AS_PROGRAM);
10981065
10991066   /* reset system control registers */
11001067   for (offs = 0; offs < 8; offs++)
11011068      system_control_w(space, offs, 0, 0x00ff);
11021069
1103   machine().device("maincpu")->reset();
1070   m_maincpu->reset();
11041071
11051072   neogeo_reset_rng(machine());
11061073
1107   start_interrupt_timers(machine());
1074   start_interrupt_timers();
11081075
11091076   /* trigger the IRQ3 that was set by MACHINE_START */
1110   update_interrupts(machine());
1077   update_interrupts();
11111078
11121079   m_recurse = 0;
11131080
r20891r20892
13261293   {
13271294      // create memory regions
13281295      size = image.get_software_region_length("maincpu");
1329      image.device().machine().memory().region_free(":maincpu");
1330      image.device().machine().memory().region_alloc(":maincpu",size, 2, ENDIANNESS_BIG);
1331      memcpy(image.device().machine().root_device().memregion("maincpu")->base(),image.get_software_region("maincpu"),size);
1332
1296      machine().memory().region_free(":maincpu");
1297      machine().memory().region_alloc(":maincpu",size, 2, ENDIANNESS_BIG);
1298      memcpy(memregion("maincpu")->base(),image.get_software_region("maincpu"),size);
1299      // Reset the reference to the region
1300      m_region_maincpu.findit();
13331301      // for whatever reason (intentional, or design flaw) software loaded via software lists is swapped in endianess vs. the standard ROM loading, regardless of the above.  Swap it to keep consistency
13341302      for (int i=0; i<size/2;i++)
13351303      {
1336         UINT16* ROM = (UINT16*)image.device().machine().root_device().memregion("maincpu")->base();
1304         UINT16* ROM = (UINT16*)memregion("maincpu")->base();
13371305         ROM[i] = ((ROM[i]&0xff00)>>8) | ((ROM[i]&0x00ff)<<8);
13381306      }
13391307
13401308      size = image.get_software_region_length("fixed");
1341      image.device().machine().memory().region_free(":fixed");
1342      image.device().machine().memory().region_alloc(":fixed",size,1, ENDIANNESS_LITTLE);
1343      memcpy(image.device().machine().root_device().memregion("fixed")->base(),image.get_software_region("fixed"),size);
1309      machine().memory().region_free(":fixed");
1310      machine().memory().region_alloc(":fixed",size,1, ENDIANNESS_LITTLE);
1311      memcpy(memregion("fixed")->base(),image.get_software_region("fixed"),size);
13441312
13451313      if(image.get_software_region("audiocpu") != NULL)
13461314      {
13471315         size = image.get_software_region_length("audiocpu");
1348         image.device().machine().memory().region_free(":audiocpu");
1349         image.device().machine().memory().region_alloc(":audiocpu",size+0x10000,1, ENDIANNESS_LITTLE);
1350         memcpy(image.device().machine().root_device().memregion("audiocpu")->base(),image.get_software_region("audiocpu"),size);
1351         memcpy(image.device().machine().root_device().memregion("audiocpu")->base()+0x10000,image.get_software_region("audiocpu"),size); // avoid reloading in XML, should just improve banking instead tho?
1316         machine().memory().region_free(":audiocpu");
1317         machine().memory().region_alloc(":audiocpu",size+0x10000,1, ENDIANNESS_LITTLE);
1318         memcpy(machine().root_device().memregion("audiocpu")->base(),image.get_software_region("audiocpu"),size);
1319         memcpy(machine().root_device().memregion("audiocpu")->base()+0x10000,image.get_software_region("audiocpu"),size); // avoid reloading in XML, should just improve banking instead tho?
13521320      }
13531321
13541322
13551323      size = image.get_software_region_length("ymsnd");
1356      image.device().machine().memory().region_free(":ymsnd");
1357      image.device().machine().memory().region_alloc(":ymsnd",size,1, ENDIANNESS_LITTLE);
1358      memcpy(image.device().machine().root_device().memregion("ymsnd")->base(),image.get_software_region("ymsnd"),size);
1324      machine().memory().region_free(":ymsnd");
1325      machine().memory().region_alloc(":ymsnd",size,1, ENDIANNESS_LITTLE);
1326      memcpy(machine().root_device().memregion("ymsnd")->base(),image.get_software_region("ymsnd"),size);
13591327      if(image.get_software_region("ymsnd.deltat") != NULL)
13601328      {
13611329         size = image.get_software_region_length("ymsnd.deltat");
1362         image.device().machine().memory().region_free(":ymsnd.deltat");
1363         image.device().machine().memory().region_alloc(":ymsnd.deltat",size,1, ENDIANNESS_LITTLE);
1364         memcpy(image.device().machine().root_device().memregion("ymsnd.deltat")->base(),image.get_software_region("ymsnd.deltat"),size);
1330         machine().memory().region_free(":ymsnd.deltat");
1331         machine().memory().region_alloc(":ymsnd.deltat",size,1, ENDIANNESS_LITTLE);
1332         memcpy(machine().root_device().memregion("ymsnd.deltat")->base(),image.get_software_region("ymsnd.deltat"),size);
13651333      }
13661334      else
1367         image.device().machine().memory().region_free(":ymsnd.deltat");  // removing the region will fix sound glitches in non-Delta-T games
1335         machine().memory().region_free(":ymsnd.deltat");  // removing the region will fix sound glitches in non-Delta-T games
13681336      ym->reset();
13691337      size = image.get_software_region_length("sprites");
1370      image.device().machine().memory().region_free(":sprites");
1371      image.device().machine().memory().region_alloc(":sprites",size,1, ENDIANNESS_LITTLE);
1372      memcpy(image.device().machine().root_device().memregion("sprites")->base(),image.get_software_region("sprites"),size);
1338      machine().memory().region_free(":sprites");
1339      machine().memory().region_alloc(":sprites",size,1, ENDIANNESS_LITTLE);
1340      memcpy(machine().root_device().memregion("sprites")->base(),image.get_software_region("sprites"),size);
13731341      if(image.get_software_region("audiocrypt") != NULL)  // encrypted Z80 code
13741342      {
13751343         size = image.get_software_region_length("audiocrypt");
1376         image.device().machine().memory().region_alloc(":audiocrypt",size,1, ENDIANNESS_LITTLE);
1377         memcpy(image.device().machine().root_device().memregion("audiocrypt")->base(),image.get_software_region("audiocrypt"),size);
1344         machine().memory().region_alloc(":audiocrypt",size,1, ENDIANNESS_LITTLE);
1345         memcpy(machine().root_device().memregion("audiocrypt")->base(),image.get_software_region("audiocrypt"),size);
13781346         // allocate the audiocpu region to decrypt data into
1379         image.device().machine().memory().region_free(":audiocpu");
1380         image.device().machine().memory().region_alloc(":audiocpu",size+0x10000,1, ENDIANNESS_LITTLE);
1347         machine().memory().region_free(":audiocpu");
1348         machine().memory().region_alloc(":audiocpu",size+0x10000,1, ENDIANNESS_LITTLE);
13811349      }
13821350
13831351      // setup cartridge ROM area
1384      image.device().machine().device("maincpu")->memory().space(AS_PROGRAM).install_read_bank(0x000080,0x0fffff,"cart_rom");
1385      image.device().machine().root_device().membank("cart_rom")->set_base(&image.device().machine().root_device().memregion("maincpu")->base()[0x80]);
1352      m_maincpu->space(AS_PROGRAM).install_read_bank(0x000080,0x0fffff,"cart_rom");
1353      machine().root_device().membank("cart_rom")->set_base(m_region_maincpu->base() + 0x80);
13861354
13871355      // handle possible protection
1388      neogeo_state *state = image.device().machine().driver_data<neogeo_state>();
1389      state->mvs_install_protection(image);
1356      mvs_install_protection(image);
13901357
13911358      return IMAGE_INIT_PASS;
13921359   }

Previous 199869 Revisions Next


© 1997-2024 The MAME Team