Previous 199869 Revisions Next

r19020 Monday 19th November, 2012 at 00:06:18 UTC by Tafoid
Removed some FBAisms and improved code sharing between AES/MVS (the interrupt handling was copy+pasted between the two).  From Haze. (nw)
[src/mame/drivers]neogeo.c
[src/mame/includes]neogeo.h
[src/mess/drivers]ng_aes.c

trunk/src/mame/includes/neogeo.h
r19019r19020
103103   UINT8      m_led2_value;
104104   UINT8      m_recurse;
105105
106   UINT8      m_vblank_level;
107   UINT8      m_raster_level;
108
106109   /* protection */
107110   UINT32     m_fatfury2_prot_data;
108111   UINT16     m_neogeo_rng;
r19019r19020
211214   virtual void video_start();
212215   virtual void video_reset();
213216   UINT32 screen_update_neogeo(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
217   void update_interrupts( running_machine &machine );
218   void create_interrupt_timers( running_machine &machine );
219   void start_interrupt_timers( running_machine &machine );
214220   TIMER_CALLBACK_MEMBER(display_position_interrupt_callback);
215221   TIMER_CALLBACK_MEMBER(display_position_vblank_callback);
216222   TIMER_CALLBACK_MEMBER(vblank_interrupt_callback);
trunk/src/mame/drivers/neogeo.c
r19019r19020
243243}
244244
245245
246static void update_interrupts( running_machine &machine )
246void neogeo_state::update_interrupts( running_machine &machine )
247247{
248248   neogeo_state *state = machine.driver_data<neogeo_state>();
249249
250   machine.device("maincpu")->execute().set_input_line(1, state->m_vblank_interrupt_pending ? ASSERT_LINE : CLEAR_LINE);
251   machine.device("maincpu")->execute().set_input_line(2, state->m_display_position_interrupt_pending ? ASSERT_LINE : CLEAR_LINE);
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);
252252   machine.device("maincpu")->execute().set_input_line(3, state->m_irq3_pending ? ASSERT_LINE : CLEAR_LINE);
253253}
254254
r19019r19020
264264   if (data & 0x04)
265265      state->m_vblank_interrupt_pending = 0;
266266
267   update_interrupts(machine);
267   state->update_interrupts(machine);
268268}
269269
270270
r19019r19020
320320}
321321
322322
323static void create_interrupt_timers( running_machine &machine )
323void neogeo_state::create_interrupt_timers( running_machine &machine )
324324{
325325   neogeo_state *state = machine.driver_data<neogeo_state>();
326326   state->m_display_position_interrupt_timer = machine.scheduler().timer_alloc(timer_expired_delegate(FUNC(neogeo_state::display_position_interrupt_callback),state));
r19019r19020
329329}
330330
331331
332static void start_interrupt_timers( running_machine &machine )
332void neogeo_state::start_interrupt_timers( running_machine &machine )
333333{
334334   neogeo_state *state = machine.driver_data<neogeo_state>();
335335   state->m_vblank_interrupt_timer->adjust(machine.primary_screen->time_until_pos(NEOGEO_VBSTART));
r19019r19020
10031003   /* initialize the memcard data structure */
10041004   memcard_data = auto_alloc_array_clear(machine(), UINT8, MEMCARD_SIZE);
10051005
1006   /* irq levels for MVS / AES */
1007   m_vblank_level = 1;
1008   m_raster_level = 2;
1009
10061010   /* start with an IRQ3 - but NOT on a reset */
10071011   m_irq3_pending = 1;
10081012
trunk/src/mess/drivers/ng_aes.c
r19019r19020
4242{
4343   cdrom_file   *cd;
4444   const cdrom_toc   *toc;
45   UINT32 current_frame;
4645};
4746
4847static neocd_t neocd;
r19019r19020
5453    NEOGEO_BANK_AUDIO_CPU_CART_BANK0, NEOGEO_BANK_AUDIO_CPU_CART_BANK1, NEOGEO_BANK_AUDIO_CPU_CART_BANK2, NEOGEO_BANK_AUDIO_CPU_CART_BANK3
5554};
5655
57// CD-ROM / DMA control registers
58struct neocd_ctrl_t
5956
60{
61   UINT8 area_sel;
62   UINT8 pcm_bank_sel;
63   UINT8 spr_bank_sel;
64   UINT32 addr_source; // target if in fill mode
65   UINT32 addr_target;
66   UINT16 fill_word;
67   UINT32 word_count;
68   UINT16 dma_mode[10];
69};
70
7157#define CD_FRAMES_MINUTE (60 * 75)
7258#define CD_FRAMES_SECOND (     75)
7359#define CD_FRAMES_PREGAP ( 2 * 75)
r19019r19020
274260   */
275261}
276262
277static void SekSetIRQLine(const INT32 line, const INT32 status)
278{
279263
280}
281
282
283264class ng_aes_state : public neogeo_state
284265{
285266public:
r19019r19020
344325
345326   DECLARE_CUSTOM_INPUT_MEMBER(get_memcard_status);
346327
347   TIMER_CALLBACK_MEMBER(display_position_interrupt_callback);
348   TIMER_CALLBACK_MEMBER(display_position_vblank_callback);
349   TIMER_CALLBACK_MEMBER(vblank_interrupt_callback);
350
351328   // neoCD
352329   TIMER_DEVICE_CALLBACK_MEMBER( neocd_access_timer_callback );
353   neocd_ctrl_t m_neocd_ctrl;
354330   INT32 nIRQAcknowledge;
355331   UINT16 nff0002;
356332   UINT16 nff0016;
r19019r19020
411387   UINT8 NeoCDCommsread();
412388   void NeoCDCommsReset();
413389   void NeoCDDoDMA();
414   UINT8 neogeoReadByteCDROM(UINT32 sekAddress);
415390   UINT16 neogeoReadWordCDROM(UINT32 sekAddress);
416   void neogeoWriteByteCDROM(UINT32 sekAddress, UINT8 byteValue);
417391   void neogeoWriteWordCDROM(UINT32 sekAddress, UINT16 wordValue);
418   UINT8 neogeoReadByteTransfer(UINT32 sekAddress);
419   UINT16 neogeoReadWordTransfer(UINT32 sekAddress);
420   void neogeoWriteByteTransfer(UINT32 sekAddress, UINT8 byteValue);
421   void neogeoWriteWordTransfer(UINT32 sekAddress, UINT16 wordValue);
392   UINT8 neogeoReadTransfer(UINT32 sekAddress, int is_byte_transfer);
393   void neogeoWriteTransfer(UINT32 sekAddress, UINT8 byteValue, int is_byte_transfer);
422394   void NeoIRQUpdate(UINT16 wordValue);
423395   void SekWriteWord(UINT32 a, UINT16 d);
424396   void SekWriteByte(UINT32 a, UINT8 d);
r19019r19020
487459//static void set_output_data(running_machine &machine, UINT8 data);
488460
489461
490/*************************************
491 *
492 *  Main CPU interrupt generation
493 *
494 *************************************/
495462
496#define IRQ2CTRL_ENABLE            (0x10)
497#define IRQ2CTRL_LOAD_RELATIVE      (0x20)
498#define IRQ2CTRL_AUTOLOAD_VBLANK   (0x40)
499#define IRQ2CTRL_AUTOLOAD_REPEAT   (0x80)
500
501
502static void adjust_display_position_interrupt_timer( running_machine &machine )
503{
504   neogeo_state *state = machine.driver_data<neogeo_state>();
505
506   if ((state->m_display_counter + 1) != 0)
507   {
508      attotime period = (attotime::from_hz(NEOGEO_PIXEL_CLOCK) * (state->m_display_counter + 1));
509      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);
510
511      state->m_display_position_interrupt_timer->adjust(period);
512   }
513}
514
515static void update_interrupts( running_machine &machine )
516{
517   neogeo_state *state = machine.driver_data<neogeo_state>();
518
519   if(strcmp((char*)machine.system().name,"aes") != 0)
520   {  // raster and vblank IRQs are swapped on the NeoCD.
521      machine.device("maincpu")->execute().set_input_line(2, state->m_vblank_interrupt_pending ? ASSERT_LINE : CLEAR_LINE);
522      machine.device("maincpu")->execute().set_input_line(1, state->m_display_position_interrupt_pending ? ASSERT_LINE : CLEAR_LINE);
523      machine.device("maincpu")->execute().set_input_line(3, state->m_irq3_pending ? ASSERT_LINE : CLEAR_LINE);
524   }
525   else
526   {
527      machine.device("maincpu")->execute().set_input_line(1, state->m_vblank_interrupt_pending ? ASSERT_LINE : CLEAR_LINE);
528      machine.device("maincpu")->execute().set_input_line(2, state->m_display_position_interrupt_pending ? ASSERT_LINE : CLEAR_LINE);
529      machine.device("maincpu")->execute().set_input_line(3, state->m_irq3_pending ? ASSERT_LINE : CLEAR_LINE);
530   }
531}
532
533
534TIMER_CALLBACK_MEMBER(ng_aes_state::display_position_interrupt_callback)
535{
536
537   if (LOG_VIDEO_SYSTEM) logerror("--- Scanline @ %d,%d\n", machine().primary_screen->vpos(), machine().primary_screen->hpos());
538
539   if (m_display_position_interrupt_control & IRQ2CTRL_ENABLE)
540   {
541      if (LOG_VIDEO_SYSTEM) logerror("*** Scanline interrupt (IRQ2) ***  y: %02x  x: %02x\n", machine().primary_screen->vpos(), machine().primary_screen->hpos());
542      m_display_position_interrupt_pending = 1;
543
544      update_interrupts(machine());
545   }
546
547   if (m_display_position_interrupt_control & IRQ2CTRL_AUTOLOAD_REPEAT)
548   {
549      if (LOG_VIDEO_SYSTEM) logerror("AUTOLOAD_REPEAT ");
550      adjust_display_position_interrupt_timer(machine());
551   }
552}
553
554
555TIMER_CALLBACK_MEMBER(ng_aes_state::display_position_vblank_callback)
556{
557
558   if (m_display_position_interrupt_control & IRQ2CTRL_AUTOLOAD_VBLANK)
559   {
560      if (LOG_VIDEO_SYSTEM) logerror("AUTOLOAD_VBLANK ");
561      adjust_display_position_interrupt_timer(machine());
562   }
563
564   /* set timer for next screen */
565   m_display_position_vblank_timer->adjust(machine().primary_screen->time_until_pos(NEOGEO_VBSTART, NEOGEO_VBLANK_RELOAD_HPOS));
566}
567
568
569TIMER_CALLBACK_MEMBER(ng_aes_state::vblank_interrupt_callback)
570{
571
572   if (LOG_VIDEO_SYSTEM) logerror("+++ VBLANK @ %d,%d\n", machine().primary_screen->vpos(), machine().primary_screen->hpos());
573
574   /* add a timer tick to the pd4990a */
575   upd4990a_addretrace(m_upd4990a);
576
577   m_vblank_interrupt_pending = 1;
578
579   update_interrupts(machine());
580
581   /* set timer for next screen */
582   m_vblank_interrupt_timer->adjust(machine().primary_screen->time_until_pos(NEOGEO_VBSTART, 0));
583}
584
585
586static void create_interrupt_timers( running_machine &machine )
587{
588   ng_aes_state *state = machine.driver_data<ng_aes_state>();
589   state->m_display_position_interrupt_timer = machine.scheduler().timer_alloc(timer_expired_delegate(FUNC(ng_aes_state::display_position_interrupt_callback),state));
590   state->m_display_position_vblank_timer = machine.scheduler().timer_alloc(timer_expired_delegate(FUNC(ng_aes_state::display_position_vblank_callback),state));
591   state->m_vblank_interrupt_timer = machine.scheduler().timer_alloc(timer_expired_delegate(FUNC(ng_aes_state::vblank_interrupt_callback),state));
592}
593
594
595static void start_interrupt_timers( running_machine &machine )
596{
597   neogeo_state *state = machine.driver_data<neogeo_state>();
598   state->m_vblank_interrupt_timer->adjust(machine.primary_screen->time_until_pos(NEOGEO_VBSTART, 0));
599   state->m_display_position_vblank_timer->adjust(machine.primary_screen->time_until_pos(NEOGEO_VBSTART, NEOGEO_VBLANK_RELOAD_HPOS));
600}
601
602
603
604463/*************************************
605464 *
606465 *  Audio CPU interrupt generation
r19019r19020
1131990
1132991
1133992
1134UINT8 ng_aes_state::neogeoReadByteTransfer(UINT32 sekAddress)
993UINT8 ng_aes_state::neogeoReadTransfer(UINT32 sekAddress, int is_byte_transfer)
1135994{
1136995//   if ((sekAddress & 0x0FFFFF) < 16)
1137996//      printf(PRINT_NORMAL, _T("  - NGCD port 0x%06X read (byte, PC: 0x%06X)\n"), sekAddress, SekGetPC(-1));
r19019r19020
11571016   return ~0;
11581017}
11591018
1160UINT16 ng_aes_state::neogeoReadWordTransfer(UINT32 sekAddress)
1161{
1162//   if ((sekAddress & 0x0FFFFF) < 16)
1163//      bprintf(PRINT_NORMAL, _T("  - Transfer: 0x%06X read (word, PC: 0x%06X)\n"), sekAddress, SekGetPC(-1));
11641019
1165   switch (nActiveTransferArea) {
1166      case 0:                     // Sprites
1167         return *((UINT16*)(NeoSpriteRAM + nSpriteTransferBank + (sekAddress & 0xFFFFF)));
1168         break;
1169      case 1:                     // ADPCM
1170         return 0xFF00 | YM2610ADPCMAROM[nNeoActiveSlot][nADPCMTransferBank + ((sekAddress & 0x0FFFFF) >> 1)];
1171         break;
1172      case 4:                     // Z80
1173         if ((sekAddress & 0xfffff) >= 0x20000) break;
1174         return 0xFF00 | NeoZ80ROMActive[(sekAddress & 0x1FFFF) >> 1];
1175         break;
1176      case 5:                     // Text
1177         return 0xFF00 | NeoTextRAM[(sekAddress & 0x3FFFF) >> 1];
1178         break;
1179   }
1180   
1181   return ~0;
1182}
1183
1184void ng_aes_state::neogeoWriteByteTransfer(UINT32 sekAddress, UINT8 byteValue)
1020void ng_aes_state::neogeoWriteTransfer(UINT32 sekAddress, UINT8 byteValue, int is_byte_transfer)
11851021{
11861022//   if ((sekAddress & 0x0FFFFF) < 16)
11871023//      bprintf(PRINT_NORMAL, _T("  - Transfer: 0x%06X -> 0x%02X (PC: 0x%06X)\n"), sekAddress, byteValue, SekGetPC(-1));
r19019r19020
11911027   }
11921028   int address;
11931029
1030   // why, is our DMA broken?
11941031   sekAddress ^= 1;
11951032
11961033   switch (nActiveTransferArea) {
r19019r19020
12101047         break;
12111048      case 4:                     // Z80
12121049         if ((sekAddress & 0xfffff) >= 0x20000) break;
1050
1051         if (!is_byte_transfer)
1052         {
1053            if (((sekAddress & 0xfffff) >= 0x20000) || nNeoCDZ80ProgWriteWordCancelHack) break;
1054            if (sekAddress == 0xe1fdf2) nNeoCDZ80ProgWriteWordCancelHack = 1;
1055         }
1056
12131057         NeoZ80ROMActive[(sekAddress & 0x1FFFF) >> 1] = byteValue;
12141058         break;
12151059      case 5:                     // Text
r19019r19020
12191063   }
12201064}
12211065
1222void ng_aes_state::neogeoWriteWordTransfer(UINT32 sekAddress, UINT16 wordValue)
1223{
1224//   if ((sekAddress & 0x0FFFFF) < 16)
1225//      bprintf(PRINT_NORMAL, _T("  - Transfer: 0x%06X -> 0x%04X (PC: 0x%06X)\n"), sekAddress, wordValue, SekGetPC(-1));
12261066
1227   if (!nTransferWriteEnable) {
1228//      return;
1229   }
1230   //int address;
12311067
1232   switch (nActiveTransferArea) {
1233      case 0:                     // Sprites
1234         neogeoWriteByteTransfer(sekAddress+0, wordValue>>8);
1235         neogeoWriteByteTransfer(sekAddress+1, wordValue&0xff);
1068UINT16 ng_aes_state::neogeoReadWordCDROM(UINT32 sekAddress)
1069{
1070//   bprintf(PRINT_NORMAL, _T("  - CDROM: 0x%06X read (word, PC: 0x%06X)\n"), sekAddress, SekGetPC(-1));
12361071
1237         //address = (nSpriteTransferBank + (sekAddress & 0x0FFFFF));
1238         //NeoSpriteRAM[(address+0)] =  (wordValue&0x00ff)>>0;
1239         //NeoSpriteRAM[address+1] =  (wordValue&0xff00)>>8;
1240      //   *((UINT16*)(NeoSpriteRAM + nSpriteTransferBank + (sekAddress & 0xFFFFF))) = wordValue;
1241      //   NeoCDOBJBankUpdate[nSpriteTransferBank >> 20] = true;
1242         break;
1243      case 1:                     // ADPCM
1244         YM2610ADPCMAROM[nNeoActiveSlot][nADPCMTransferBank + ((sekAddress & 0x0FFFFF) >> 1)] = wordValue;
1245         break;
1246      case 4:                     // Z80
1247         // The games that write here, seem to write crap, however the BIOS writes the Z80 code here, and not in the byte area
1248         // So basically, we are allowing writes to here, until the BIOS has finished writing the program, then not allowing any further writes
1249         if (((sekAddress & 0xfffff) >= 0x20000) || nNeoCDZ80ProgWriteWordCancelHack) break;
1250         if (sekAddress == 0xe1fdf2) nNeoCDZ80ProgWriteWordCancelHack = 1;
1251         NeoZ80ROMActive[(sekAddress & 0x1FFFF) >> 1] = wordValue;
1252         break;
1253      case 5:                     // Text
1254         NeoTextRAM[(sekAddress & 0x3FFFF) >> 1] = wordValue;
1255//         NeoUpdateTextOne((sekAddress & 0x3FFFF) >> 1, wordValue);
1256         break;
1257   }
1258}
12591072
1260
1261UINT8 ng_aes_state::neogeoReadByteCDROM(UINT32 sekAddress)
1262{
1263//   bprintf(PRINT_NORMAL, _T("  - CDROM: 0x%06X read (byte, PC: 0x%06X)\n"), sekAddress, SekGetPC(-1));
1264   
12651073   switch (sekAddress & 0xFFFF) {
12661074
1267      case 0x0017:
1075      case 0x0016:
12681076         return nff0016;
12691077
12701078      // LC8951 registers
1271      case 0x0101:
1079      case 0x0100:
12721080//         bprintf(PRINT_NORMAL, _T("  - LC8951 register read (PC: 0x%06X)\n"), SekGetPC(-1));
12731081         return nLC8951Register;
1274      case 0x0103: {
1082      case 0x0102: {
12751083//         bprintf(PRINT_NORMAL, _T("  - LC8951 register 0x%X read (PC: 0x%06X)\n"), nLC8951Register, SekGetPC(-1));
12761084
12771085         INT32 reg = LC8951RegistersR[nLC8951Register];
r19019r19020
12921100      }
12931101
12941102      // CD mechanism communication
1295      case 0x0161:
1296         return NeoCDCommsread();
1103      case 0x0160:
1104         return NeoCDCommsread();   
12971105
1298      default: {
1299//         bprintf(PRINT_NORMAL, _T("  - NGCD port 0x%06X read (byte, PC: 0x%06X)\n"), sekAddress, SekGetPC(-1));
1300      }
1106      case 0x011C: // region
1107         return ~((0x10 | (NeoSystem & 3)) << 8);
13011108   }
13021109
1110
1111//   bprintf(PRINT_NORMAL, _T("  - NGCD port 0x%06X read (word, PC: 0x%06X)\n"), sekAddress, SekGetPC(-1));
1112
13031113   return ~0;
13041114}
13051115
1306UINT16 ng_aes_state::neogeoReadWordCDROM(UINT32 sekAddress)
1116
1117void ng_aes_state::neogeoWriteWordCDROM(UINT32 sekAddress, UINT16 wordValue)
13071118{
1308//   bprintf(PRINT_NORMAL, _T("  - CDROM: 0x%06X read (word, PC: 0x%06X)\n"), sekAddress, SekGetPC(-1));
1119//   bprintf(PRINT_NORMAL, _T("  - NGCD port 0x%06X -> 0x%04X (PC: 0x%06X)\n"), sekAddress, wordValue, SekGetPC(-1));
1120   int byteValue = wordValue & 0xff;
13091121
1310#if 1
1311   switch (sekAddress & 0xFFFF) {
1312      case 0x011C:
1313         return ~((0x10 | (NeoSystem & 3)) << 8);
1314   }
1315#endif
1122   switch (sekAddress & 0xFFFE) {
1123      case 0x0002:
1124//         bprintf(PRINT_IMPORTANT, _T("  - NGCD Interrupt mask -> 0x%04X (PC: 0x%06X)\n"), wordValue, SekGetPC(-1));
1125         nff0002 = wordValue;         
13161126
1317//   bprintf(PRINT_NORMAL, _T("  - NGCD port 0x%06X read (word, PC: 0x%06X)\n"), sekAddress, SekGetPC(-1));
1127// LC8951RegistersR[1] |= 0x20;
13181128
1319   return ~0;
1320}
1129         //if (nff0002 & 0x0500)
1130         //   nNeoCDCyclesIRQPeriod = (INT32)(12000000.0 * nBurnCPUSpeedAdjust / (256.0 * 75.0));
1131         //else
1132         //   nNeoCDCyclesIRQPeriod = (INT32)(12000000.0 * nBurnCPUSpeedAdjust / (256.0 *  75.0));
13211133
1322void ng_aes_state::neogeoWriteByteCDROM(UINT32 sekAddress, UINT8 byteValue)
1323{
1324//   bprintf(PRINT_NORMAL, _T("  - Neo Geo CD: 0x%06X -> 0x%02X (PC: 0x%06X)\n"), sekAddress, byteValue, SekGetPC(-1));
1134         break;
13251135
1326   switch (sekAddress & 0xFFFF) {
1327      case 0x000F:
1328         NeoCDIRQUpdate(byteValue);
1136      case 0x000E:
1137         NeoCDIRQUpdate(wordValue); // irqack
13291138         break;
13301139
1331      case 0x0017:
1140      case 0x0016:
13321141         nff0016 = byteValue;
13331142         break;
13341143
1335      case 0x0061:
1144         // DMA controller
1145      case 0x0060:
13361146         if (byteValue & 0x40) {
13371147            NeoCDDoDMA();
13381148         }
13391149         break;
13401150
1151
1152      case 0x0064:
1153         NeoCDDMAAddress1 &= 0x0000FFFF;
1154         NeoCDDMAAddress1 |= wordValue << 16;
1155         break;
1156      case 0x0066:
1157         NeoCDDMAAddress1 &= 0xFFFF0000;
1158         NeoCDDMAAddress1 |= wordValue;
1159         break;
1160      case 0x0068:
1161         NeoCDDMAAddress2 &= 0x0000FFFF;
1162         NeoCDDMAAddress2 |= wordValue << 16;
1163         break;
1164      case 0x006A:
1165         NeoCDDMAAddress2 &= 0xFFFF0000;
1166         NeoCDDMAAddress2 |= wordValue;
1167         break;
1168      case 0x006C:
1169         NeoCDDMAValue1 = wordValue;
1170         break;
1171      case 0x006E:
1172         NeoCDDMAValue2 = wordValue;
1173         break;
1174      case 0x0070:
1175         NeoCDDMACount &= 0x0000FFFF;
1176         NeoCDDMACount |= wordValue << 16;
1177         break;
1178      case 0x0072:
1179         NeoCDDMACount &= 0xFFFF0000;
1180         NeoCDDMACount |= wordValue;
1181         break;
1182
1183      case 0x007E:
1184         NeoCDDMAMode = wordValue;
1185//         bprintf(PRINT_NORMAL, _T("  - DMA controller 0x%2X -> 0x%04X (PC: 0x%06X)\n"), sekAddress & 0xFF, wordValue, SekGetPC(-1));
1186         break;
1187
1188      // upload DMA controller program
1189
1190      case 0x0080:
1191      case 0x0082:
1192      case 0x0084:
1193      case 0x0086:
1194      case 0x0088:
1195      case 0x008A:
1196      case 0x008C:
1197      case 0x008E:
1198//         bprintf(PRINT_NORMAL, _T("  - DMA controller program[%02i] -> 0x%04X (PC: 0x%06X)\n"), sekAddress & 0x0F, wordValue, SekGetPC(-1));
1199         break;
1200
13411201      // LC8951 registers
1342      case 0x0101:
1202      case 0x0100:
13431203         nLC8951Register = byteValue & 0x0F;
13441204//         bprintf(PRINT_NORMAL, _T("  - LC8951 register -> 0x%02X (PC: 0x%06X)\n"), nLC8951Register, SekGetPC(-1));
13451205         break;
1346      case 0x0103:
1206      case 0x0102:
13471207//         bprintf(PRINT_NORMAL, _T("  - LC8951 register 0x%X -> 0x%02X (PC: 0x%06X)\n"), nLC8951Register, byteValue, SekGetPC(-1));
13481208         switch (nLC8951Register) {
13491209            case 3:                                             // DBCH
r19019r19020
13741234         nLC8951Register = (nLC8951Register + 1) & 0x0F;
13751235         break;
13761236
1377      case 0x0105:
1237      case 0x0104:
13781238//         bprintf(PRINT_NORMAL, _T("  - NGCD 0xE00000 area -> 0x%02X (PC: 0x%06X)\n"), byteValue, SekGetPC(-1));
13791239         nActiveTransferArea = byteValue;
13801240         break;
13811241
1382      case 0x0121:
1242      case 0x0120:
13831243//         bprintf(PRINT_NORMAL, _T("  - NGCD OBJ BUSREQ -> 1 (PC: 0x%06X)\n"), SekGetPC(-1));
13841244         NeoSetSpriteSlot(1);
13851245         memset(NeoCDOBJBankUpdate, 0, sizeof(NeoCDOBJBankUpdate));
13861246         break;
1387      case 0x0123:
1247      case 0x0122:
13881248//         bprintf(PRINT_NORMAL, _T("  - NGCD PCM BUSREQ -> 1 (PC: 0x%06X) %x\n"), SekGetPC(-1), byteValue);
13891249         break;
1390      case 0x0127:
1250      case 0x0126:
13911251//         bprintf(PRINT_NORMAL, _T("  - NGCD Z80 BUSREQ -> 1 (PC: 0x%06X)\n"), SekGetPC(-1));
13921252         curr_space->machine().scheduler().synchronize();
1393         curr_space->machine().device("audiocpu")->execute().set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
1253         curr_space->machine().device("audiocpu")->execute().set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
13941254
13951255         break;
1396      case 0x0129:
1256      case 0x0128:
13971257//         bprintf(PRINT_NORMAL, _T("  - NGCD FIX BUSREQ -> 1 (PC: 0x%06X)\n"), SekGetPC(-1));
13981258         NeoSetTextSlot(1);
13991259         break;
14001260
1401      case 0x0141:
1261      case 0x0140:
14021262//         bprintf(PRINT_NORMAL, _T("  - NGCD OBJ BUSREQ -> 0 (PC: 0x%06X)\n"), SekGetPC(-1));   
14031263         video_reset();
14041264         break;
1405      case 0x0143:
1265      case 0x0142:
14061266//         bprintf(PRINT_NORMAL, _T("  - NGCD PCM BUSREQ -> 0 (PC: 0x%06X)\n"), SekGetPC(-1));
14071267         break;
1408      case 0x0147:
1268      case 0x0146:
14091269//         bprintf(PRINT_NORMAL, _T("  - NGCD Z80 BUSREQ -> 0 (PC: 0x%06X)\n"), SekGetPC(-1));
14101270         curr_space->machine().scheduler().synchronize();
1411         curr_space->machine().device("audiocpu")->execute().set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
1271         curr_space->machine().device("audiocpu")->execute().set_input_line(INPUT_LINE_HALT, CLEAR_LINE);
14121272         break;
1413      case 0x0149:
1273      case 0x0148:
14141274//         bprintf(PRINT_NORMAL, _T("  - NGCD FIX BUSREQ -> 0 (PC: 0x%06X)\n"), SekGetPC(-1));
14151275         video_reset();
14161276         break;
14171277
14181278      // CD mechanism communication
1419      case 0x0163:
1279      case 0x0162:
14201280         NeoCDCommsWrite(byteValue);
14211281         break;
1422      case 0x0165:
1282      case 0x0164:
14231283         NeoCDCommsControl(byteValue & 1, byteValue & 2);
14241284         break;
14251285
1426      case 0x016D:
1286      case 0x016c:
14271287//         bprintf(PRINT_ERROR, _T("  - NGCD port 0x%06X -> 0x%02X (PC: 0x%06X)\n"), sekAddress, byteValue, SekGetPC(-1));
14281288
14291289         MapVectorTable(!(byteValue == 0xFF));
r19019r19020
14321292//bRunPause = 1;
14331293         break;
14341294
1435      case 0x016F:
1295      case 0x016e:
14361296//         bprintf(PRINT_IMPORTANT, _T("  - NGCD 0xE00000 area write access %s (0x%02X, PC: 0x%06X)\n"), byteValue ? _T("enabled") : _T("disabled"), byteValue, SekGetPC(-1));
14371297
14381298         nTransferWriteEnable = byteValue;
14391299         break;
14401300
1441      case 0x0181: {
1301      case 0x0180: {
14421302         static UINT8 clara = 0;
14431303         if (!byteValue && clara) {
14441304//            bprintf(PRINT_IMPORTANT, _T("  - NGCD CD communication reset (PC: 0x%06X)\n"), SekGetPC(-1));
r19019r19020
14471307         clara = byteValue;         
14481308         break;
14491309      }
1450      case 0x0183: {
1310      case 0x0182: {
14511311         static UINT8 clara = 0;
14521312         if (!byteValue && clara) {
14531313//            bprintf(PRINT_IMPORTANT, _T("  - NGCD Z80 reset (PC: 0x%06X)\n"), SekGetPC(-1));
r19019r19020
14561316         clara = byteValue;         
14571317         break;
14581318      }
1459      case 0x01A1:
1319      case 0x01A0:
14601320         nSpriteTransferBank = (byteValue & 3) << 20;
14611321         break;
1462      case 0x01A3:
1322      case 0x01A2:
14631323         nADPCMTransferBank  = (byteValue & 1) << 19;
14641324         break;
14651325
1466      default: {
1467//         bprintf(PRINT_NORMAL, _T("  - NGCD port 0x%06X -> 0x%02X (PC: 0x%06X)\n"), sekAddress, byteValue, SekGetPC(-1));
1468      }
1469   }
1470}
14711326
1472void ng_aes_state::neogeoWriteWordCDROM(UINT32 sekAddress, UINT16 wordValue)
1473{
1474//   bprintf(PRINT_NORMAL, _T("  - NGCD port 0x%06X -> 0x%04X (PC: 0x%06X)\n"), sekAddress, wordValue, SekGetPC(-1));
1475
1476   switch (sekAddress & 0xFFFE) {
1477      case 0x0002:
1478//         bprintf(PRINT_IMPORTANT, _T("  - NGCD Interrupt mask -> 0x%04X (PC: 0x%06X)\n"), wordValue, SekGetPC(-1));
1479         nff0002 = wordValue;         
1480
1481// LC8951RegistersR[1] |= 0x20;
1482
1483         //if (nff0002 & 0x0500)
1484         //   nNeoCDCyclesIRQPeriod = (INT32)(12000000.0 * nBurnCPUSpeedAdjust / (256.0 * 75.0));
1485         //else
1486         //   nNeoCDCyclesIRQPeriod = (INT32)(12000000.0 * nBurnCPUSpeedAdjust / (256.0 *  75.0));
1487
1488         break;
1489
1490      case 0x000E:
1491         NeoCDIRQUpdate(wordValue); // irqack
1492         break;
1493
1494      // DMA controller
1495
1496      case 0x0064:
1497         NeoCDDMAAddress1 &= 0x0000FFFF;
1498         NeoCDDMAAddress1 |= wordValue << 16;
1499         break;
1500      case 0x0066:
1501         NeoCDDMAAddress1 &= 0xFFFF0000;
1502         NeoCDDMAAddress1 |= wordValue;
1503         break;
1504      case 0x0068:
1505         NeoCDDMAAddress2 &= 0x0000FFFF;
1506         NeoCDDMAAddress2 |= wordValue << 16;
1507         break;
1508      case 0x006A:
1509         NeoCDDMAAddress2 &= 0xFFFF0000;
1510         NeoCDDMAAddress2 |= wordValue;
1511         break;
1512      case 0x006C:
1513         NeoCDDMAValue1 = wordValue;
1514         break;
1515      case 0x006E:
1516         NeoCDDMAValue2 = wordValue;
1517         break;
1518      case 0x0070:
1519         NeoCDDMACount &= 0x0000FFFF;
1520         NeoCDDMACount |= wordValue << 16;
1521         break;
1522      case 0x0072:
1523         NeoCDDMACount &= 0xFFFF0000;
1524         NeoCDDMACount |= wordValue;
1525         break;
1526
1527      case 0x007E:
1528         NeoCDDMAMode = wordValue;
1529//         bprintf(PRINT_NORMAL, _T("  - DMA controller 0x%2X -> 0x%04X (PC: 0x%06X)\n"), sekAddress & 0xFF, wordValue, SekGetPC(-1));
1530         break;
1531
1532      // upload DMA controller program
1533
1534      case 0x0080:
1535      case 0x0082:
1536      case 0x0084:
1537      case 0x0086:
1538      case 0x0088:
1539      case 0x008A:
1540      case 0x008C:
1541      case 0x008E:
1542//         bprintf(PRINT_NORMAL, _T("  - DMA controller program[%02i] -> 0x%04X (PC: 0x%06X)\n"), sekAddress & 0x0F, wordValue, SekGetPC(-1));
1543         break;
1544
15451327      default: {
15461328//         bprintf(PRINT_NORMAL, _T("  - NGCD port 0x%06X -> 0x%04X (PC: 0x%06X)\n"), sekAddress, wordValue, SekGetPC(-1));
15471329      }
r19019r19020
22061988
22071989READ16_MEMBER(ng_aes_state::neocd_control_r)
22081990{
2209   if (mem_mask == 0xffff)
2210   {
2211      return neogeoReadWordCDROM(0xff0000+ (offset*2));
2212   }
2213   else if (mem_mask ==0xff00)
2214   {
2215      return neogeoReadByteCDROM(0xff0000+ (offset*2)) << 8;
2216   }
2217   else if (mem_mask ==0x00ff)
2218   {
2219      return neogeoReadByteCDROM(0xff0000+ (offset*2)+1) & 0xff;
2220   }
2221
2222   return 0x0000;
2223
1991   return neogeoReadWordCDROM(0xff0000+ (offset*2));
22241992}
22251993
22261994
22271995WRITE16_MEMBER(ng_aes_state::neocd_control_w)
22281996{
2229   if (mem_mask == 0xffff)
2230   {
2231      neogeoWriteWordCDROM(0xff0000+ (offset*2), data);
2232   }
2233   else if (mem_mask ==0xff00)
2234   {
2235      neogeoWriteByteCDROM(0xff0000+ (offset*2), data>>8);
2236   }
2237   else if (mem_mask ==0x00ff)
2238   {
2239      neogeoWriteByteCDROM(0xff0000+ (offset*2)+1, data&0xff);
2240   }
1997   neogeoWriteWordCDROM(0xff0000+ (offset*2), data);
22411998}
22421999
22432000
r19019r19020
22512008
22522009READ16_MEMBER(ng_aes_state::neocd_transfer_r)
22532010{
2254   if (mem_mask == 0xffff)
2011   int is_byte_transfer = 0;
2012   if (mem_mask != 0xffff) is_byte_transfer = 1;
2013
2014   UINT16 ret = 0x0000;
2015
2016
2017   
2018   if (mem_mask & 0x00ff)
22552019   {
2256      return neogeoReadWordTransfer(0xe00000+ (offset*2));
2020      ret |= neogeoReadTransfer(0xe00000+ (offset*2)+1, is_byte_transfer) & 0xff;
22572021   }
2258   else if (mem_mask ==0xff00)
2022   if (mem_mask & 0xff00)
22592023   {
2260      return neogeoReadByteTransfer(0xe00000+ (offset*2)) << 8;
2024      ret |= neogeoReadTransfer(0xe00000+ (offset*2), is_byte_transfer) << 8;
22612025   }
2262   else if (mem_mask ==0x00ff)
2263   {
2264      return neogeoReadByteTransfer(0xe00000+ (offset*2)+1) & 0xff;
2265   }
22662026
2027   return ret;
22672028
2268   return 0x0000;
2269
22702029}
22712030
22722031WRITE16_MEMBER(ng_aes_state::neocd_transfer_w)
22732032{
2274   if (mem_mask == 0xffff)
2033   int is_byte_transfer = 0;
2034   if (mem_mask != 0xffff) is_byte_transfer = 1;
2035
2036
2037   if (mem_mask & 0xff00)
22752038   {
2276      neogeoWriteWordTransfer(0xe00000+ (offset*2), data);
2039      neogeoWriteTransfer(0xe00000+ (offset*2), data>>8, is_byte_transfer);
22772040   }
2278   else if (mem_mask ==0xff00)
2041   
2042   if (mem_mask & 0x00ff)
22792043   {
2280      neogeoWriteByteTransfer(0xe00000+ (offset*2), data>>8);
2044      neogeoWriteTransfer(0xe00000+ (offset*2)+1, data&0xff, is_byte_transfer);
22812045   }
2282   else if (mem_mask ==0x00ff)
2283   {
2284      neogeoWriteByteTransfer(0xe00000+ (offset*2)+1, data&0xff);
2285   }
22862046
2047
22872048}
22882049
22892050/*
r19019r19020
23962157   /* set the initial audio CPU ROM banks */
23972158   audio_cpu_banking_init(machine);
23982159
2399   create_interrupt_timers(machine);
2160   state->create_interrupt_timers(machine);
24002161
2162   /* irq levels for MVS / AES */
2163   state->m_vblank_level = 1;
2164   state->m_raster_level = 2;
2165
24012166   /* start with an IRQ3 - but NOT on a reset */
24022167   state->m_irq3_pending = 1;
24032168
r19019r19020
24492214
24502215   common_machine_start(machine());
24512216
2217   /* irq levels for NEOCD (swapped compared to MVS / AES) */
2218   m_vblank_level = 2;
2219   m_raster_level = 1;
2220
2221
24522222   /* initialize the memcard data structure */
24532223   /* NeoCD doesn't have memcard slots, rather, it has a larger internal memory which works the same */
24542224   m_memcard_data = auto_alloc_array_clear(machine(), UINT8, 0x2000);
r19019r19020
29682738
29692739
29702740
2971int nVBLankIRQ   = 2;
2972int nScanlineIRQ = 1;
2973
2974void ng_aes_state::NeoIRQUpdate(UINT16 wordValue)
2975{
2976   nIRQAcknowledge |= (wordValue & 7);
2977
2978//   bprintf(PRINT_NORMAL, _T("  - IRQ Ack -> %02X (at line %3i).\n"), nIRQAcknowledge, SekCurrentScanline());
2979
2980   if ((nIRQAcknowledge & 7) == 7) {
2981      SekSetIRQLine(7, SEK_IRQSTATUS_NONE);
2982   } else {
2983      if ((nIRQAcknowledge & 1) == 0) {
2984         SekSetIRQLine(3, SEK_IRQSTATUS_ACK);
2985      }
2986      if ((nIRQAcknowledge & 2) == 0) {
2987         SekSetIRQLine(nScanlineIRQ, SEK_IRQSTATUS_ACK);
2988      }
2989      if ((nIRQAcknowledge & 4) == 0) {
2990         SekSetIRQLine(nVBLankIRQ, SEK_IRQSTATUS_ACK);
2991      }
2992   }
2993}
2994
2995
29962741/* NeoCD uses custom vectors on IRQ4 to handle various events from the CDC */
29972742
29982743static IRQ_CALLBACK(neocd_int_callback)
29992744{
30002745   ng_aes_state *state = device->machine().driver_data<ng_aes_state>();
30012746
3002   // this is how FBA seems to be setup, but surely this would cause the custom
3003   // interrupt levels to end up being used for the regular interrupts too in cases?
3004   if (state->nNeoCDIRQVectorAck) {
3005      state->nNeoCDIRQVectorAck = 0;
3006      return state->nNeoCDIRQVector;
2747   if (irqline==4)
2748   {
2749      if (state->nNeoCDIRQVectorAck) {
2750         state->nNeoCDIRQVectorAck = 0;
2751         return state->nNeoCDIRQVector;
2752      }
30072753   }
30082754
30092755   return (0x60+irqline*4)/4;
r19019r19020
30112757
30122758void ng_aes_state::NeoCDIRQUpdate(UINT8 byteValue)
30132759{
2760   // do we also need to check the regular interrupts like FBA?
2761
30142762   nIRQAcknowledge |= (byteValue & 0x38);
30152763
3016//   bprintf(PRINT_NORMAL, _T("  - IRQ Ack -> %02X (CD, at line %3i).\n"), nIRQAcknowledge, SekCurrentScanline());
3017
3018   if ((nIRQAcknowledge & 0x3F) == 0x3F) {
3019      SekSetIRQLine(7, SEK_IRQSTATUS_NONE);
3020   } else {
3021      if ((nIRQAcknowledge & 0x07) != 7) {
3022         NeoIRQUpdate(0);
3023         return;
3024      }
3025      if ((nIRQAcknowledge & 0x08) == 0) {
3026         nNeoCDIRQVector = 0x17;
3027         nNeoCDIRQVectorAck = 1;
3028         m_maincpu->set_input_line(4, HOLD_LINE);
3029         return;
3030      }
3031      if ((nIRQAcknowledge & 0x10) == 0) {
3032         nNeoCDIRQVector = 0x16;
3033         nNeoCDIRQVectorAck = 1;
3034         m_maincpu->set_input_line(4, HOLD_LINE);
3035         return;
3036      }
3037      if ((nIRQAcknowledge & 0x20) == 0) {
3038         nNeoCDIRQVector = 0x15;
3039         nNeoCDIRQVectorAck = 1;
3040         m_maincpu->set_input_line(4, HOLD_LINE);
3041         return;
3042      }
2764   if ((nIRQAcknowledge & 0x08) == 0) {
2765      nNeoCDIRQVector = 0x17;
2766      nNeoCDIRQVectorAck = 1;
2767      m_maincpu->set_input_line(4, HOLD_LINE);
2768      return;
30432769   }
2770   if ((nIRQAcknowledge & 0x10) == 0) {
2771      nNeoCDIRQVector = 0x16;
2772      nNeoCDIRQVectorAck = 1;
2773      m_maincpu->set_input_line(4, HOLD_LINE);
2774      return;
2775   }
2776   if ((nIRQAcknowledge & 0x20) == 0) {
2777      nNeoCDIRQVector = 0x15;
2778      nNeoCDIRQVectorAck = 1;
2779      m_maincpu->set_input_line(4, HOLD_LINE);
2780      return;
2781   }
30442782}
30452783
30462784TIMER_DEVICE_CALLBACK_MEMBER( ng_aes_state::neocd_access_timer_callback )

Previous 199869 Revisions Next


© 1997-2024 The MAME Team