Previous 199869 Revisions Next

r22603 Monday 29th April, 2013 at 07:24:50 UTC by Fabio Priuli
(MESS) NES IRQ clean up part 3: Improved IRQ assert/clear mechanism
for a few pcbs/mappers. This fixes a lot of 1-line glitches, plus gfx corruption
in Pinbot tables. It also allows Sangokushi II - Haou no Tairiku to boot. nw.

(Thanks a lot to Micko and OG for the clarifications about some MAME macros :) )
[src/mess/machine]nes_bandai.c nes_irem.c nes_jaleco.c nes_konami.c nes_legacy.c nes_mmc3.c nes_mmc5.c nes_namcot.c nes_somari.c nes_sunsoft.c nes_taito.c nes_tengen.c

trunk/src/mess/machine/nes_bandai.c
r22602r22603
341341         
342342         if (!m_irq_count)
343343         {
344            machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
344            machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
345345            m_irq_enable = 0;
346346         }
347347      }
r22602r22603
372372         break;
373373      case 0x0a:
374374         m_irq_enable = data & 0x01;
375         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
375376         break;
376377      case 0x0b:
377378         m_irq_count = (m_irq_count & 0xff00) | data;
trunk/src/mess/machine/nes_taito.c
r22602r22603
240240         m_irq_count--;
241241
242242      if (m_irq_enable && !blanked && (m_irq_count == 0) && prior_count)
243         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
243         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
244244   }
245245}
246246
r22602r22603
273273         break;
274274      case 0x4003:
275275         m_irq_enable = 0;
276         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
276277         break;
277278      case 0x6000:
278279         set_nt_mirroring(BIT(data, 6) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
trunk/src/mess/machine/nes_jaleco.c
r22602r22603
434434         {
435435            if (!(m_irq_count & 0x000f))
436436            {
437               machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
437               machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
438438               m_irq_count = (m_irq_count & 0xfff0) | 0x000f;
439439            }
440440            else
r22602r22603
444444         {
445445            if (!(m_irq_count & 0x00ff))
446446            {
447               machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
447               machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
448448               m_irq_count = (m_irq_count & 0xff00) | 0x00ff;
449449            }
450450            else
r22602r22603
454454         {
455455            if (!(m_irq_count & 0x0fff))
456456            {
457               machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
457               machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
458458               m_irq_count = (m_irq_count & 0xf000) | 0x0fff;
459459            }
460460            else
r22602r22603
464464         {
465465            if (!m_irq_count)
466466            {
467               machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
467               machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
468468               m_irq_count = 0xffff;
469469            }
470470            else
r22602r22603
536536         break;
537537      case 0x7000:
538538         m_irq_count = m_irq_count_latch;
539         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
539540         break;
540541      case 0x7001:
541542         m_irq_enable = data & 0x01;
542543         m_irq_mode = data & 0x0e;
544         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
543545         break;
544546
545547      case 0x7002:
trunk/src/mess/machine/nes_irem.c
r22602r22603
287287           
288288         if (!m_irq_count)
289289         {
290            machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
290            machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
291291            m_irq_enable = 0;
292292         }
293293      }
r22602r22603
310310
311311      case 0x1003:
312312         m_irq_enable = data & 0x80;
313         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
313314         break;
314315
315316      case 0x1004:
316317         m_irq_count = m_irq_count_latch;
318         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
317319         break;
318320
319321      case 0x1005:
trunk/src/mess/machine/nes_konami.c
r22602r22603
371371         {
372372            if ((m_irq_count & 0x00ff) == 0xff)
373373            {
374               machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
374               machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
375375               m_irq_count = m_irq_count_latch;
376376            }
377377            else
r22602r22603
381381         {
382382            if (m_irq_count == 0xffff)
383383            {
384               machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
384               machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
385385               m_irq_count = m_irq_count_latch;
386386            }
387387            else
r22602r22603
415415         m_irq_enable_latch = data & 0x01;
416416         if (data & 0x02)
417417            m_irq_count = m_irq_count_latch;
418         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
418419         break;
419420      case 0x5000:
420421         m_irq_enable = m_irq_enable_latch;
422         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
421423         break;
422424      case 0x7000:
423425         prg16_89ab(data);
r22602r22603
441443   if (m_irq_count == 0xff)
442444   {
443445      m_irq_count = m_irq_count_latch;
444      machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
446      machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
445447   }
446448   else
447449      m_irq_count++;
r22602r22603
538540               m_irq_count_latch = (m_irq_count_latch & 0x0f) | ((data & 0x0f) << 4);
539541               break;
540542            case 0x200:
541               m_irq_mode = data & 0x04;   // currently not implemented: 0 = prescaler mode / 1 = CPU mode
543               m_irq_mode = data & 0x04;
542544               m_irq_enable = data & 0x02;
543545               m_irq_enable_latch = data & 0x01;
544546               if (data & 0x02)
545547                  m_irq_count = m_irq_count_latch;
548               machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
546549               break;
547550            case 0x300:
548551               m_irq_enable = m_irq_enable_latch;
552               machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
549553               break;
550554         }
551555         break;
r22602r22603
614618               m_irq_count_latch = data;
615619               break;
616620            case 0x100:
617               m_irq_mode = data & 0x04;   // currently not implemented: 0 = prescaler mode / 1 = CPU mode
621               m_irq_mode = data & 0x04;
618622               m_irq_enable = data & 0x02;
619623               m_irq_enable_latch = data & 0x01;
620624               if (data & 0x02)
621625                  m_irq_count = m_irq_count_latch;
626               machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
622627               break;
623628            case 0x200:
624629               m_irq_enable = m_irq_enable_latch;
630               machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
625631               break;
626632            default:
627633               logerror("VRC-6 write_h uncaught write, addr: %04x value: %02x\n", ((offset & 0x7000) | add_lines) + 0x8000, data);
r22602r22603
727733         m_irq_count_latch = data;
728734         break;
729735      case 0x7000:
730         m_irq_mode = data & 0x04;   // currently not implemented: 0 = prescaler mode / 1 = CPU mode
736         m_irq_mode = data & 0x04;
731737         m_irq_enable = data & 0x02;
732738         m_irq_enable_latch = data & 0x01;
733739         if (data & 0x02)
734740            m_irq_count = m_irq_count_latch;
741         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
735742         break;
736743      case 0x7008: case 0x7010: case 0x7018:
737744         m_irq_enable = m_irq_enable_latch;
745         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
738746         break;
739747
740748      default:
r22602r22603
764772
765773// FIXME: we currently emulate this as a base YM2413!
766774
767
768#define VRC7_NTSC_CLOCK (21477272.724 / 12)
769
770775static MACHINE_CONFIG_FRAGMENT( vrc7 )
771776
772777   // additional sound hardware
773778   MCFG_SPEAKER_STANDARD_MONO("addon")
774779
775   MCFG_SOUND_ADD("ym", YM2413, VRC7_NTSC_CLOCK)
780   MCFG_SOUND_ADD("ym", YM2413, N2A03_DEFAULTCLOCK)
776781   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "addon", 0.5)
777782MACHINE_CONFIG_END
778783
trunk/src/mess/machine/nes_mmc3.c
r22602r22603
203203      {
204204         LOG_MMC(("irq fired, scanline: %d (MAME %d, beam pos: %d)\n", scanline,
205205                  machine().primary_screen->vpos(), machine().primary_screen->hpos()));
206         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
206         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
207207      }
208208   }
209209   m_irq_clear = 0;
r22602r22603
302302
303303      case 0x6000:
304304         m_irq_enable = 0;
305         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
305306         break;
306307
307308      case 0x6001:
trunk/src/mess/machine/nes_sunsoft.c
r22602r22603
272272      {
273273         if (!m_irq_count)
274274         {
275            machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
275            machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
276276            m_irq_count = 0xffff;
277277            m_irq_enable = 0;
278278         }
r22602r22603
311311      case 0x5800:
312312         m_irq_enable = BIT(data, 4);
313313         m_irq_toggle = 0;
314         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
314315         break;
315316      case 0x6800:
316317         switch (data & 3)
r22602r22603
466467         {
467468            m_irq_count = 0xffff;
468469            if (m_irq_enable & 0x01) // bit0, trigger enable
469               machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
470               machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
470471         }
471472         else
472473            m_irq_count--;
r22602r22603
514515               break;
515516            case 0x0d:
516517               m_irq_enable = data;
518               if (!(m_irq_enable & 1))
519                  machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
517520               break;
518521            case 0x0e:
519522               m_irq_count = (m_irq_count & 0xff00) | data;
trunk/src/mess/machine/nes_mmc5.c
r22602r22603
255255   if (scanline == m_irq_count)
256256   {
257257      if (m_irq_enable)
258         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
258         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
259259
260260      m_irq_status = 0xff;
261261   }
r22602r22603
311311#else
312312         value = m_irq_status;
313313         m_irq_status &= ~0x80;
314         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
314315         return value;
315316#endif
316317
trunk/src/mess/machine/nes_legacy.c
r22602r22603
168168      {
169169         if (m_irq_count == 0xffff)
170170         {
171            machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
171            machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
172172            m_irq_count = 0;
173173            m_irq_enable = 0;
174174         }
r22602r22603
194194
195195      case 0x401:
196196         m_irq_enable = 0;
197         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
197198         break;
198199      case 0x402:
199200         m_irq_count = (m_irq_count & 0xff00) | data;
r22602r22603
275276
276277      case 0x401:
277278         m_irq_enable = 0;
279         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
278280         break;
279281      case 0x402:
280282         m_irq_count = (m_irq_count & 0xff00) | data;
trunk/src/mess/machine/nes_tengen.c
r22602r22603
181181         m_irq_count--;
182182         if (m_irq_enable && !blanked && !m_irq_count)
183183         {
184            machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
184            machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
185185         }
186186      }
187187   }
r22602r22603
313313
314314      case 0x6000:
315315         m_irq_enable = 0;
316         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
316317         break;
317318
318319      case 0x6001:
trunk/src/mess/machine/nes_namcot.c
r22602r22603
409409      if (m_irq_enable)
410410      {
411411         if (m_irq_count == 0x7fff)   // counter does not wrap to 0!
412            machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
412            machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
413413         else
414414            m_irq_count++;
415415      }
r22602r22603
425425   {
426426      case 0x1000: /* low byte of IRQ */
427427         m_irq_count = (m_irq_count & 0x7f00) | data;
428         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
428429         break;
429430      case 0x1800: /* high byte of IRQ, IRQ enable in high bit */
430431         m_irq_count = (m_irq_count & 0xff) | ((data & 0x7f) << 8);
431432         m_irq_enable = data & 0x80;
433         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
432434         break;
433435   }
434436}
r22602r22603
442444   {
443445      case 0x1000:
444446         return m_irq_count & 0xff;
447         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
445448      case 0x1800:
446449         return (m_irq_count >> 8) & 0xff;
450         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
447451      default:
448452         return 0x00;
449453   }
trunk/src/mess/machine/nes_somari.c
r22602r22603
1616#include "emu.h"
1717#include "machine/nes_somari.h"
1818
19#include "cpu/m6502/m6502.h"
1920
21
2022#ifdef NES_PCB_DEBUG
2123#define VERBOSE 1
2224#else
r22602r22603
228230      case 0x2001: break;
229231      case 0x4000: m_irq_count_latch = data; break;
230232      case 0x4001: m_irq_count = 0; break;
231      case 0x6000: m_irq_enable = 0; break;
233      case 0x6000: m_irq_enable = 0; machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, CLEAR_LINE); break;
232234      case 0x6001: m_irq_enable = 1; break;
233235   }
234236}

Previous 199869 Revisions Next


© 1997-2024 The MAME Team