Previous 199869 Revisions Next

r22529 Wednesday 24th April, 2013 at 21:46:39 UTC by Fabio Priuli
(MESS) NES IRQ clean up part 1: CPU-driven IRQ now actually tick based on CPU cycles rather than on scanlines. nw.
[src/mess/machine]nes_bandai.c nes_bandai.h nes_bootleg.c nes_bootleg.h nes_cony.c nes_cony.h nes_irem.c nes_irem.h nes_jaleco.c nes_jaleco.h nes_kaiser.c nes_kaiser.h nes_legacy.c nes_legacy.h nes_namcot.c nes_namcot.h nes_pirate.c nes_pirate.h nes_sunsoft.c nes_sunsoft.h

trunk/src/mess/machine/nes_bootleg.c
r22528r22529
236236void nes_smb3p_device::device_start()
237237{
238238   common_start();
239   irq_timer = timer_alloc(TIMER_IRQ);
240   irq_timer->adjust(attotime::zero, 0, machine().device<cpu_device>("maincpu")->cycles_to_attotime(1));
241   
239242   save_item(NAME(m_irq_enable));
240243   save_item(NAME(m_irq_count));
241244}
r22528r22529
287290void nes_smb2j_device::device_start()
288291{
289292   common_start();
293   irq_timer = timer_alloc(TIMER_IRQ);
294   irq_timer->adjust(attotime::zero, 0, machine().device<cpu_device>("maincpu")->cycles_to_attotime(1));
295   
290296   save_item(NAME(m_irq_enable));
291297   save_item(NAME(m_irq_count));
292298}
r22528r22529
307313void nes_smb2ja_device::device_start()
308314{
309315   common_start();
316   irq_timer = timer_alloc(TIMER_IRQ);
317   irq_timer->adjust(attotime::zero, 0, machine().device<cpu_device>("maincpu")->cycles_to_attotime(1));
318   
310319   save_item(NAME(m_irq_enable));
311320   save_item(NAME(m_irq_count));
312321}
r22528r22529
327336void nes_smb2jb_device::device_start()
328337{
329338   common_start();
339   irq_timer = timer_alloc(TIMER_IRQ);
340   irq_timer->adjust(attotime::zero, 0, machine().device<cpu_device>("maincpu")->cycles_to_attotime(1));
341   
330342   save_item(NAME(m_irq_enable));
331343   save_item(NAME(m_irq_count));
332344}
r22528r22529
733745
734746 -------------------------------------------------*/
735747
736void nes_smb3p_device::hblank_irq(int scanline, int vblank, int blanked)
748void nes_smb3p_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
737749{
738   if (m_irq_enable)
750   if (id == TIMER_IRQ)
739751   {
740      if ((0xffff - m_irq_count) < 114)
752      if (m_irq_enable)
741753      {
742         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
743         m_irq_enable = 0;
754         if (m_irq_count == 0xffff)
755         {
756            machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
757            m_irq_enable = 0;
758         }
759         else
760            m_irq_count++;
744761      }
745
746      m_irq_count = (m_irq_count + 114) & 0xffff;
747762   }
748763}
749764
r22528r22529
893908
894909 -------------------------------------------------*/
895910
896void nes_smb2j_device::hblank_irq(int scanline, int vblank, int blanked)
911void nes_smb2j_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
897912{
898   if (m_irq_enable)
913   if (id == TIMER_IRQ)
899914   {
900      if ((0xfff - m_irq_count) < 114)
915      if (m_irq_enable)
901916      {
902         m_irq_count = (m_irq_count + 114) & 0xfff;
903         m_irq_enable = 0;
904         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
917         if (m_irq_count == 0xfff)
918         {
919            machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
920            m_irq_enable = 0;
921            m_irq_count = 0;
922         }
923         else
924            m_irq_count++;
905925      }
906      else
907         m_irq_count += 114;
908926   }
909927}
910928
r22528r22529
972990
973991 -------------------------------------------------*/
974992
975void nes_smb2ja_device::hblank_irq(int scanline, int vblank, int blanked)
993void nes_smb2ja_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
976994{
977   if (m_irq_enable)
995   if (id == TIMER_IRQ)
978996   {
979      if ((0xfff - m_irq_count) <= 114)
997      if (m_irq_enable)
980998      {
981         m_irq_count = (m_irq_count + 1) & 0xfff;
982         m_irq_enable = 0;
983         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
999         if (m_irq_count == 0xfff)
1000         {
1001            machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
1002            m_irq_enable = 0;
1003            m_irq_count = 0;
1004         }
1005         else
1006            m_irq_count++;
9841007      }
985      else
986         m_irq_count += 114;
9871008   }
9881009}
9891010
r22528r22529
10261047
10271048 -------------------------------------------------*/
10281049
1029void nes_smb2jb_device::hblank_irq(int scanline, int vblank, int blanked)
1050void nes_smb2jb_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
10301051{
1031   if (m_irq_enable)
1052   if (id == TIMER_IRQ)
10321053   {
1033      if ((0xfff - m_irq_count) < 114)
1054      if (m_irq_enable)
10341055      {
1035         m_irq_count = (m_irq_count + 114) & 0xfff;
1036         m_irq_enable = 0;
1037         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
1056         if (m_irq_count == 0xfff)
1057         {
1058            machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
1059            m_irq_enable = 0;
1060            m_irq_count = 0;
1061         }
1062         else
1063            m_irq_count++;
10381064      }
1039      else
1040         m_irq_count += 114;
10411065   }
10421066}
10431067
trunk/src/mess/machine/nes_bootleg.h
r22528r22529
102102
103103   // device-level overrides
104104   virtual void device_start();
105   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
105106   virtual DECLARE_WRITE8_MEMBER(write_h);
106107
107   virtual void hblank_irq(int scanline, int vblank, int blanked);
108108   virtual void pcb_reset();
109109
110110private:
111111   UINT16 m_irq_count;
112112   int m_irq_enable;
113   
114   static const device_timer_id TIMER_IRQ = 0;
115   emu_timer *irq_timer;
113116};
114117
115118
r22528r22529
163166   
164167   // device-level overrides
165168   virtual void device_start();
169   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
166170   virtual DECLARE_READ8_MEMBER(read_l);
167171   virtual DECLARE_READ8_MEMBER(read_m);
168172   virtual DECLARE_WRITE8_MEMBER(write_ex);
169173   virtual DECLARE_WRITE8_MEMBER(write_l);
170174   virtual DECLARE_WRITE8_MEMBER(write_h);
171175   
172   virtual void hblank_irq(int scanline, int vblank, int blanked);
173176   virtual void pcb_reset();
174177   
175178private:
176179   UINT16 m_irq_count;
177180   int m_irq_enable;
181   
182   static const device_timer_id TIMER_IRQ = 0;
183   emu_timer *irq_timer;
178184};
179185
180186
r22528r22529
188194
189195   // device-level overrides
190196   virtual void device_start();
197   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
191198   virtual DECLARE_READ8_MEMBER(read_m);
192199   virtual DECLARE_WRITE8_MEMBER(write_h);
193200
194   virtual void hblank_irq(int scanline, int vblank, int blanked);
195201   virtual void pcb_reset();
196202
197203private:
198204   UINT16 m_irq_count;
199205   int m_irq_enable;
206   
207   static const device_timer_id TIMER_IRQ = 0;
208   emu_timer *irq_timer;
200209};
201210
202211
r22528r22529
210219
211220   // device-level overrides
212221   virtual void device_start();
222   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
213223   virtual DECLARE_READ8_MEMBER(read_m);
214224   virtual DECLARE_WRITE8_MEMBER(write_l);
215225   virtual DECLARE_WRITE8_MEMBER(write_ex);
216226
217   virtual void hblank_irq(int scanline, int vblank, int blanked);
218227   virtual void pcb_reset();
219228
220229private:
221230   UINT16 m_irq_count;
222231   int m_irq_enable;
232   
233   static const device_timer_id TIMER_IRQ = 0;
234   emu_timer *irq_timer;
223235};
224236
225237
trunk/src/mess/machine/nes_cony.c
r22528r22529
6161void nes_cony_device::device_start()
6262{
6363   common_start();
64   irq_timer = timer_alloc(TIMER_IRQ);
65   irq_timer->adjust(attotime::zero, 0, machine().device<cpu_device>("maincpu")->cycles_to_attotime(1));
66   
6467   save_item(NAME(m_irq_enable));
6568   save_item(NAME(m_irq_count));
6669
r22528r22529
9497void nes_yoko_device::device_start()
9598{
9699   common_start();
100   irq_timer = timer_alloc(TIMER_IRQ);
101   irq_timer->adjust(attotime::zero, 0, machine().device<cpu_device>("maincpu")->cycles_to_attotime(1));
102   
97103   save_item(NAME(m_irq_enable));
98104   save_item(NAME(m_irq_count));
99105
r22528r22529
147153
148154 -------------------------------------------------*/
149155
150/* Here, IRQ counter decrements every CPU cycle. Since we update it every scanline,
151 we need to decrement it by 114 (Each scanline consists of 341 dots and, on NTSC,
152 there are 3 dots to every 1 CPU cycle, hence 114 is the number of cycles per scanline ) */
153void nes_cony_device::hblank_irq( int scanline, int vblank, int blanked )
156void nes_cony_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
154157{
155   if (m_irq_enable)
158   if (id == TIMER_IRQ)
156159   {
157      if (m_irq_count <= 114)
160      if (m_irq_enable)
158161      {
159         m_irq_enable = 0;
160         m_irq_count = 0xffff;
161         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
162         if (!m_irq_count)
163         {
164            machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
165            m_irq_enable = 0;
166            m_irq_count = 0xffff;
167         }
168         else
169            m_irq_count--;
162170      }
163      else
164         m_irq_count -= 114;
165171   }
166172}
167173
trunk/src/mess/machine/nes_cony.h
r22528r22529
1515
1616   // device-level overrides
1717   virtual void device_start();
18   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
1819   virtual DECLARE_READ8_MEMBER(read_l);
1920   virtual DECLARE_WRITE8_MEMBER(write_l);
2021   virtual DECLARE_WRITE8_MEMBER(write_h);
2122
22   virtual void hblank_irq(int scanline, int vblank, int blanked);
2323   virtual void pcb_reset();
2424
2525protected:
r22528r22529
2828
2929   UINT16 m_irq_count;
3030   int m_irq_enable;
31
31   
32   static const device_timer_id TIMER_IRQ = 0;
33   emu_timer *irq_timer;
34   
3235   UINT8 m_latch1, m_latch2;
3336   UINT8 m_low_reg[4];
3437   UINT8 m_reg[10];
trunk/src/mess/machine/nes_bandai.c
r22528r22529
144144void nes_lz93d50_device::device_start()
145145{
146146   common_start();
147   irq_timer = timer_alloc(TIMER_IRQ);
148   irq_timer->adjust(attotime::zero, 0, machine().device<cpu_device>("maincpu")->cycles_to_attotime(1));
149   
147150   save_item(NAME(m_irq_enable));
148151   save_item(NAME(m_irq_count));
149152}
r22528r22529
162165void nes_lz93d50_24c01_device::device_start()
163166{
164167   common_start();
168   irq_timer = timer_alloc(TIMER_IRQ);
169   irq_timer->adjust(attotime::zero, 0, machine().device<cpu_device>("maincpu")->cycles_to_attotime(1));
170   
165171   save_item(NAME(m_irq_enable));
166172   save_item(NAME(m_irq_count));
167173   save_item(NAME(m_i2c_mem));
r22528r22529
184190void nes_fjump2_device::device_start()
185191{
186192   common_start();
193   irq_timer = timer_alloc(TIMER_IRQ);
194   irq_timer->adjust(attotime::zero, 0, machine().device<cpu_device>("maincpu")->cycles_to_attotime(1));
195   
187196   save_item(NAME(m_reg));
188197}
189198
r22528r22529
316325
317326 -------------------------------------------------*/
318327
319/* Here, IRQ counter decrements every CPU cycle. Since we update it every scanline,
320 we need to decrement it by 114 (Each scanline consists of 341 dots and, on NTSC,
321 there are 3 dots to every 1 CPU cycle, hence 114 is the number of cycles per scanline ) */
322void nes_lz93d50_device::hblank_irq(int scanline, int vblank, int blanked)
328void nes_lz93d50_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
323329{
324   /* 114 is the number of cycles per scanline */
325   /* TODO: change to reflect the actual number of cycles spent */
326   if (m_irq_enable)
330   if (id == TIMER_IRQ)
327331   {
328      if (m_irq_count <= 114)
332      if (m_irq_enable)
329333      {
330         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
331         m_irq_count = (0xffff - 114 + m_irq_count);   // wrap around the 16 bits counter
334         // 16bit counter, IRQ fired when the counter goes from 1 to 0
335         // after firing, the counter is *not* reloaded, but next clock
336         // counter wraps around from 0 to 0xffff         
337         if (!m_irq_count)
338            m_irq_count = 0xffff;
339         else
340            m_irq_count--;
341         
342         if (!m_irq_count)
343         {
344            machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
345            m_irq_enable = 0;
346         }
332347      }
333      m_irq_count -= 114;
334348   }
335349}
336350
r22528r22529
472486   prg16_cdef(prg_base | 0x0f);
473487}
474488
489READ8_MEMBER(nes_fjump2_device::read_m)
490{
491   LOG_MMC(("fjump2 read_m, offset: %04x\n", offset));
492   return m_battery[offset & (m_battery_size - 1)];
493}
494
495WRITE8_MEMBER(nes_fjump2_device::write_m)
496{
497   LOG_MMC(("fjump2 write_m, offset: %04x, data: %02x\n", offset, data));
498   m_battery[offset & (m_battery_size - 1)] = data;
499}
500
475501WRITE8_MEMBER(nes_fjump2_device::write_h)
476502{
477503   LOG_MMC(("fjump2 write_h, offset: %04x, data: %02x\n", offset, data));
trunk/src/mess/machine/nes_bandai.h
r22528r22529
5959
6060   // device-level overrides
6161   virtual void device_start();
62   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
6263   virtual DECLARE_WRITE8_MEMBER(lz93d50_write);
6364   virtual DECLARE_WRITE8_MEMBER(write_h) { lz93d50_write(space, offset, data, mem_mask); }
6465   virtual DECLARE_WRITE8_MEMBER(write_m);
6566
66   virtual void hblank_irq(int scanline, int vblank, int blanked);
6767   virtual void pcb_reset();
6868
6969protected:
7070   UINT16     m_irq_count;
7171   int        m_irq_enable;
72   
73   static const device_timer_id TIMER_IRQ = 0;
74   emu_timer *irq_timer;
7275};
7376
7477
r22528r22529
138141
139142   // device-level overrides
140143   virtual void device_start();
144   virtual DECLARE_READ8_MEMBER(read_m);
145   virtual DECLARE_WRITE8_MEMBER(write_m);
141146   virtual DECLARE_WRITE8_MEMBER(write_h);
142147
143148   virtual void pcb_reset();
trunk/src/mess/machine/nes_kaiser.c
r22528r22529
132132void nes_ks7032_device::device_start()
133133{
134134   common_start();
135   irq_timer = timer_alloc(TIMER_IRQ);
136   irq_timer->adjust(attotime::zero, 0, machine().device<cpu_device>("maincpu")->cycles_to_attotime(1));
137   
135138   save_item(NAME(m_latch));
136139   save_item(NAME(m_irq_enable));
137140   save_item(NAME(m_irq_count));
r22528r22529
155158void nes_ks7017_device::device_start()
156159{
157160   common_start();
161   irq_timer = timer_alloc(TIMER_IRQ);
162   irq_timer->adjust(attotime::zero, 0, machine().device<cpu_device>("maincpu")->cycles_to_attotime(1));
163   
158164   save_item(NAME(m_latch));
159165   save_item(NAME(m_irq_enable));
160166   save_item(NAME(m_irq_count));
r22528r22529
291297
292298 -------------------------------------------------*/
293299
300void nes_ks7032_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
301{
302   if (id == TIMER_IRQ)
303   {
304      if (m_irq_enable)
305      {
306         if (m_irq_count == 0xffff)
307         {
308            m_irq_enable = 0;
309            m_irq_count = 0;
310            machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
311         }
312         else
313            m_irq_count++;
314      }
315   }
316}
317
294318void nes_ks7032_device::prg_update()
295319{
296320   prg8_89(m_reg[1]);
r22528r22529
298322   prg8_cd(m_reg[3]);
299323}
300324
301void nes_ks7032_device::hblank_irq(int scanline, int vblank, int blanked)
302{
303   if (m_irq_enable)
304   {
305      if (m_irq_count >= (0xffff - 114))
306      {
307         m_irq_enable = 0;
308         m_irq_count = 0;
309         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
310      }
311      else
312         m_irq_count += 114;
313   }
314}
315
316325WRITE8_MEMBER(nes_ks7032_device::ks7032_write)
317326{
318327   LOG_MMC(("ks7032_write, offset: %04x, data: %02x\n", offset, data));
r22528r22529
406415
407416 -------------------------------------------------*/
408417
409void nes_ks7017_device::hblank_irq(int scanline, int vblank, int blanked)
418void nes_ks7017_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
410419{
411   if (m_irq_enable)
420   if (id == TIMER_IRQ)
412421   {
413      if (m_irq_count <= 114)
422      if (m_irq_enable)
414423      {
415         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
416         m_irq_enable = 0;
417         m_irq_status |= 0x01;
424         if (!m_irq_count)
425         {
426            machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
427            m_irq_enable = 0;
428            m_irq_status |= 0x01;
429         }
430         else
431            m_irq_count--;
418432      }
419      else
420         m_irq_count -= 114;
421433   }
422434}
423435
trunk/src/mess/machine/nes_kaiser.h
r22528r22529
5151
5252   // device-level overrides
5353   virtual void device_start();
54   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
5455   virtual DECLARE_READ8_MEMBER(read_m);
5556   virtual DECLARE_WRITE8_MEMBER(ks7032_write);
5657   virtual DECLARE_WRITE8_MEMBER(write_h) { ks7032_write(space, offset, data, mem_mask); }
5758
58   virtual void hblank_irq(int scanline, int vblank, int blanked);
5959   virtual void pcb_reset();
6060
6161protected:
r22528r22529
6666
6767   UINT16 m_irq_count;
6868   int m_irq_enable;
69   
70   static const device_timer_id TIMER_IRQ = 0;
71   emu_timer *irq_timer;
6972};
7073
7174
r22528r22529
9396
9497   // device-level overrides
9598   virtual void device_start();
99   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
96100   virtual DECLARE_READ8_MEMBER(read_ex);
97101   virtual DECLARE_WRITE8_MEMBER(write_ex);
98102   virtual DECLARE_WRITE8_MEMBER(write_l);
99103
100   virtual void hblank_irq(int scanline, int vblank, int blanked);
101104   virtual void pcb_reset();
102105
103106private:
r22528r22529
106109   UINT16 m_irq_count;
107110   UINT8 m_irq_status;
108111   int m_irq_enable;
112   
113   static const device_timer_id TIMER_IRQ = 0;
114   emu_timer *irq_timer;
109115};
110116
111117
trunk/src/mess/machine/nes_jaleco.c
r22528r22529
208208void nes_ss88006_device::device_start()
209209{
210210   common_start();
211   irq_timer = timer_alloc(TIMER_IRQ);
212   irq_timer->adjust(attotime::zero, 0, machine().device<cpu_device>("maincpu")->cycles_to_attotime(1));
213   
211214   save_item(NAME(m_mmc_prg_bank));
212215   save_item(NAME(m_mmc_vrom_bank));
213216   save_item(NAME(m_irq_enable));
r22528r22529
421424
422425 -------------------------------------------------*/
423426
424/* Here, IRQ counter decrements every CPU cycle. Since we update it every scanline,
425 we need to decrement it by 114 (Each scanline consists of 341 dots and, on NTSC,
426 there are 3 dots to every 1 CPU cycle, hence 114 is the number of cycles per scanline ) */
427void nes_ss88006_device::hblank_irq(int scanline, int vblank, int blanked)
427void nes_ss88006_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
428428{
429   /* Increment & check the IRQ scanline counter */
430   if (m_irq_enable)
429   if (id == TIMER_IRQ)
431430   {
432      LOG_MMC(("scanline: %d, irq count: %04x\n", scanline, m_irq_count));
433      if (m_irq_mode & 0x08)
431      if (m_irq_enable)
434432      {
435         if ((m_irq_count & 0x000f) < 114)    // always true, but we only update the IRQ once per scanlines so we cannot be more precise :(
433         if (m_irq_mode & 0x08)   // 4bits counter
436434         {
437            machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
438            m_irq_count = (m_irq_count & ~0x000f) | (0x0f - (114 & 0x0f) + (m_irq_count & 0x000f)); // sort of wrap around the counter
435            if (!(m_irq_count & 0x000f))
436            {
437               machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
438               m_irq_count = (m_irq_count & 0xfff0) | 0x000f;
439            }
440            else
441               m_irq_count = (m_irq_count & 0xfff0) | ((m_irq_count & 0x000f) - 1);
439442         }
440         // decrements should not affect upper bits, so we don't do anything here (114 > 0x0f)
441      }
442      else if (m_irq_mode & 0x04)
443      {
444         if ((m_irq_count & 0x00ff) < 114)
443         else if (m_irq_mode & 0x04)   // 8bits counter
445444         {
446            machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
447            m_irq_count = (m_irq_count & ~0x00ff) | (0xff - 114 + (m_irq_count & 0x00ff)); // wrap around the 8 bits counter
445            if (!(m_irq_count & 0x00ff))
446            {
447               machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
448               m_irq_count = (m_irq_count & 0xff00) | 0x00ff;
449            }
450            else
451               m_irq_count = (m_irq_count & 0xff00) | ((m_irq_count & 0x00ff) - 1);
448452         }
449         else
450            m_irq_count -= 114;
451      }
452      else if (m_irq_mode & 0x02)
453      {
454         if ((m_irq_count & 0x0fff)  < 114)
453         else if (m_irq_mode & 0x02)   // 12bits counter
455454         {
456            machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
457            m_irq_count = (m_irq_count & ~0x0fff) | (0xfff - 114 + (m_irq_count & 0x0fff));    // wrap around the 12 bits counter
455            if (!(m_irq_count & 0x0fff))
456            {
457               machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
458               m_irq_count = (m_irq_count & 0xf000) | 0x0fff;
459            }
460            else
461               m_irq_count = (m_irq_count & 0xf000) | ((m_irq_count & 0x0fff) - 1);
458462         }
459         else
460            m_irq_count -= 114;
463         else    // 16bits counter
464         {
465            if (!m_irq_count)
466            {
467               machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
468               m_irq_count = 0xffff;
469            }
470            else
471               m_irq_count = m_irq_count - 1;
472         }
461473      }
462      else if (m_irq_count < 114)
463      {
464         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
465         m_irq_count = (0xffff - 114 + m_irq_count);   // wrap around the 16 bits counter
466      }
467      else
468         m_irq_count -= 114;
469474   }
470475}
471476
r22528r22529
529534      case 0x6003:
530535         m_irq_count_latch = (m_irq_count_latch & 0x0fff) | ((data & 0x0f) << 12);
531536         break;
532
533537      case 0x7000:
534538         m_irq_count = m_irq_count_latch;
535539         break;
trunk/src/mess/machine/nes_jaleco.h
r22528r22529
137137
138138   // device-level overrides
139139   virtual void device_start();
140   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
140141   virtual DECLARE_WRITE8_MEMBER(ss88006_write);
141142   virtual DECLARE_WRITE8_MEMBER(write_h) { ss88006_write(space, offset, data, mem_mask); }
142143
143   virtual void hblank_irq(int scanline, int vblank, int blanked);
144144   virtual void pcb_reset();
145145
146146protected:
147147   UINT16 m_irq_count, m_irq_count_latch;
148148   UINT8 m_irq_mode;
149149   int m_irq_enable;
150
150   
151   static const device_timer_id TIMER_IRQ = 0;
152   emu_timer *irq_timer;
153   
151154   UINT8 m_mmc_prg_bank[3];
152155   UINT8 m_mmc_vrom_bank[8];
153156
trunk/src/mess/machine/nes_irem.c
r22528r22529
130130void nes_h3001_device::device_start()
131131{
132132   common_start();
133   irq_timer = timer_alloc(TIMER_IRQ);
134   irq_timer->adjust(attotime::zero, 0, machine().device<cpu_device>("maincpu")->cycles_to_attotime(1));
135   
133136   save_item(NAME(m_irq_enable));
134137   save_item(NAME(m_irq_count));
135138   save_item(NAME(m_irq_count_latch));
r22528r22529
270273
271274 -------------------------------------------------*/
272275
273/* Here, IRQ counter decrements every CPU cycle. Since we update it every scanline,
274 we need to decrement it by 114 (Each scanline consists of 341 dots and, on NTSC,
275 there are 3 dots to every 1 CPU cycle, hence 114 is the number of cycles per scanline ) */
276void nes_h3001_device::hblank_irq(int scanline, int vblank, int blanked)
276
277void nes_h3001_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
277278{
278   if (m_irq_enable)
279   if (id == TIMER_IRQ)
279280   {
280      m_irq_count -= 114;
281
282      if (m_irq_count <= 114)
281      if (m_irq_enable)
283282      {
284         m_irq_enable = 0;
285         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
283         // 16bit counter, IRQ fired when the counter reaches 0
284         // after firing, the counter is *not* reloaded and does not wrap
285         if (m_irq_count > 0)
286            m_irq_count--;
287           
288         if (!m_irq_count)
289         {
290            machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
291            m_irq_enable = 0;
292         }
286293      }
287294   }
288295}
trunk/src/mess/machine/nes_irem.h
r22528r22529
8181
8282   // device-level overrides
8383   virtual void device_start();
84   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
8485   virtual DECLARE_WRITE8_MEMBER(write_h);
8586
86   virtual void hblank_irq(int scanline, int vblank, int blanked);
8787   virtual void pcb_reset();
8888
8989protected:
9090   UINT16     m_irq_count, m_irq_count_latch;
9191   int        m_irq_enable;
92   
93   static const device_timer_id TIMER_IRQ = 0;
94   emu_timer *irq_timer;
9295};
9396
9497
trunk/src/mess/machine/nes_legacy.c
r22528r22529
7878void nes_ffe4_device::device_start()
7979{
8080   common_start();
81   
81   irq_timer = timer_alloc(TIMER_IRQ);
82   irq_timer->adjust(attotime::zero, 0, machine().device<cpu_device>("maincpu")->cycles_to_attotime(1));
83
8284   m_exram = auto_alloc_array_clear(machine(), UINT8, 0x8000);
8385   save_pointer(NAME(m_exram), 0x8000);
8486   save_item(NAME(m_exram_enabled));
r22528r22529
158160
159161 -------------------------------------------------*/
160162
161/* Here, IRQ counter decrements every CPU cycle. Since we update it every scanline,
162 we need to decrement it by 114 (Each scanline consists of 341 dots and, on NTSC,
163 there are 3 dots to every 1 CPU cycle, hence 114 is the number of cycles per scanline ) */
164
165void nes_ffe4_device::hblank_irq(int scanline, int vblank, int blanked)
163void nes_ffe4_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
166164{
167   // 114 is the number of cycles per scanline
168   // TODO: change to reflect the actual number of cycles spent
169   if (m_irq_enable)
165   if (id == TIMER_IRQ)
170166   {
171      if ((0xffff - m_irq_count) < 114)
167      if (m_irq_enable)
172168      {
173         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
174         m_irq_count = 0;
175         m_irq_enable = 0;
169         if (m_irq_count == 0xffff)
170         {
171            machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
172            m_irq_count = 0;
173            m_irq_enable = 0;
174         }
175         else
176            m_irq_count++;
176177      }
177      m_irq_count += 114;
178178   }
179179}
180180
trunk/src/mess/machine/nes_legacy.h
r22528r22529
3131
3232   // device-level overrides
3333   virtual void device_start();
34   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
3435   virtual DECLARE_WRITE8_MEMBER(write_l);
3536   virtual DECLARE_WRITE8_MEMBER(write_h);
3637   virtual DECLARE_READ8_MEMBER(chr_r);
3738   virtual DECLARE_WRITE8_MEMBER(chr_w);
3839
39   virtual void hblank_irq(int scanline, int vblank, int blanked);
4040   virtual void pcb_reset();
4141
4242protected:
4343   UINT16 m_irq_count;
4444   int m_irq_enable;
45
45   
46   static const device_timer_id TIMER_IRQ = 0;
47   emu_timer *irq_timer;
48   
4649   UINT8 m_latch;
4750   UINT8 *m_exram;
4851   int m_exram_enabled;
trunk/src/mess/machine/nes_namcot.c
r22528r22529
145145void nes_namcot340_device::device_start()
146146{
147147   common_start();
148   irq_timer = timer_alloc(TIMER_IRQ);
149   irq_timer->adjust(attotime::zero, 0, machine().device<cpu_device>("maincpu")->cycles_to_attotime(1));
150   
148151   save_item(NAME(m_irq_enable));
149152   save_item(NAME(m_irq_count));
150153
r22528r22529
170173void nes_namcot175_device::device_start()
171174{
172175   common_start();
176   irq_timer = timer_alloc(TIMER_IRQ);
177   irq_timer->adjust(attotime::zero, 0, machine().device<cpu_device>("maincpu")->cycles_to_attotime(1));
178   
173179   save_item(NAME(m_irq_enable));
174180   save_item(NAME(m_irq_count));
175181   save_item(NAME(m_wram_enable));
r22528r22529
197203void nes_namcot163_device::device_start()
198204{
199205   common_start();
206   irq_timer = timer_alloc(TIMER_IRQ);
207   irq_timer->adjust(attotime::zero, 0, machine().device<cpu_device>("maincpu")->cycles_to_attotime(1));
208   
200209   save_item(NAME(m_irq_enable));
201210   save_item(NAME(m_irq_count));
202211   save_item(NAME(m_wram_protect));
r22528r22529
393402
394403 -------------------------------------------------*/
395404
396/* Here, IRQ counter decrements every CPU cycle. Since we update it every scanline,
397 we need to decrement it by 114 (Each scanline consists of 341 dots and, on NTSC,
398 there are 3 dots to every 1 CPU cycle, hence 114 is the number of cycles per scanline ) */
399void nes_namcot340_device::hblank_irq(int scanline, int vblank, int blanked)
405void nes_namcot340_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
400406{
401   if (m_irq_enable)
407   if (id == TIMER_IRQ)
402408   {
403      if (m_irq_count >= (0x7fff - 114))
409      if (m_irq_enable)
404410      {
405         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
406         m_irq_count = 0;
411         if (m_irq_count == 0x7fff)   // counter does not wrap to 0!
412            machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
413         else
414            m_irq_count++;
407415      }
408      else
409         m_irq_count += 114;
410416   }
411417}
412418
trunk/src/mess/machine/nes_pirate.c
r22528r22529
427427void nes_cityfight_device::device_start()
428428{
429429   common_start();
430   irq_timer = timer_alloc(TIMER_IRQ);
431   irq_timer->adjust(attotime::zero, 0, machine().device<cpu_device>("maincpu")->cycles_to_attotime(1));
432   
430433   save_item(NAME(m_prg_reg));
431434   save_item(NAME(m_prg_mode));
432435   save_item(NAME(m_irq_enable));
r22528r22529
12351238
12361239 -------------------------------------------------*/
12371240
1238void nes_cityfight_device::hblank_irq(int scanline, int vblank, int blanked)
1241void nes_cityfight_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
12391242{
1240   if (m_irq_enable)
1243   if (id == TIMER_IRQ)
12411244   {
1242      if (m_irq_count <= 114)
1245      if (m_irq_enable)
12431246      {
1244         m_irq_count = 0xffff;
1245         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
1247         if (!m_irq_count)
1248         {
1249            machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
1250            m_irq_count = 0xffff;
1251         }
1252         else
1253            m_irq_count--;
12461254      }
1247      else
1248         m_irq_count -= 114;
12491255   }
12501256}
12511257
trunk/src/mess/machine/nes_namcot.h
r22528r22529
7575
7676   // device-level overrides
7777   virtual void device_start();
78   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
7879   virtual DECLARE_READ8_MEMBER(n340_loread);
7980   virtual DECLARE_WRITE8_MEMBER(n340_lowrite);
8081   virtual DECLARE_WRITE8_MEMBER(n340_hiwrite);
r22528r22529
8283   virtual DECLARE_WRITE8_MEMBER(write_l) { n340_lowrite(space, offset, data, mem_mask); }
8384   virtual DECLARE_WRITE8_MEMBER(write_h) { n340_hiwrite(space, offset, data, mem_mask); }
8485
85   virtual void hblank_irq(int scanline, int vblank, int blanked);
8686   virtual void pcb_reset();
8787
8888protected:
8989   UINT16 m_irq_count;
9090   int m_irq_enable;
91
91   
92   static const device_timer_id TIMER_IRQ = 0;
93   emu_timer *irq_timer;
94   
9295   // Namcot-163 chip contains 8K of internal ram, possibly battery backed up (not emulated yet)
9396   // was it also present in 175 & 340 chips?
9497   UINT8 *m_n163_ram;
trunk/src/mess/machine/nes_pirate.h
r22528r22529
333333
334334   // device-level overrides
335335   virtual void device_start();
336   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
336337   virtual DECLARE_WRITE8_MEMBER(write_h);
337338
338   virtual void hblank_irq(int scanline, int vblank, int blanked);
339339   virtual void pcb_reset();
340340
341341private:
r22528r22529
343343   UINT8 m_prg_reg, m_prg_mode;
344344   UINT16 m_irq_count;
345345   int m_irq_enable;
346
346   
347   static const device_timer_id TIMER_IRQ = 0;
348   emu_timer *irq_timer;
349   
347350   UINT8 m_mmc_vrom_bank[8];
348351};
349352
trunk/src/mess/machine/nes_sunsoft.c
r22528r22529
122122void nes_sunsoft_3_device::device_start()
123123{
124124   common_start();
125   irq_timer = timer_alloc(TIMER_IRQ);
126   irq_timer->adjust(attotime::zero, 0, machine().device<cpu_device>("maincpu")->cycles_to_attotime(1));
127   
125128   save_item(NAME(m_irq_enable));
126129   save_item(NAME(m_irq_toggle));
127130   save_item(NAME(m_irq_count));
r22528r22529
163166void nes_sunsoft_fme7_device::device_start()
164167{
165168   common_start();
169   irq_timer = timer_alloc(TIMER_IRQ);
170   // this has to be hardcoded because some some scanline code only suits NTSC... it will be fixed with PPU rewrite
171   irq_timer->adjust(attotime::zero, 0, attotime::from_hz((21477272.724 / 12)));
172//   irq_timer->adjust(attotime::zero, 0, machine().device<cpu_device>("maincpu")->cycles_to_attotime(1));
173   
166174   save_item(NAME(m_wram_bank));
167175   save_item(NAME(m_latch));
168176   save_item(NAME(m_irq_enable));
r22528r22529
255263
256264 -------------------------------------------------*/
257265
258/* Here, IRQ counter decrements every CPU cycle. Since we update it every scanline,
259 we need to decrement it by 114 (Each scanline consists of 341 dots and, on NTSC,
260 there are 3 dots to every 1 CPU cycle, hence 114 is the number of cycles per scanline ) */
261void nes_sunsoft_3_device::hblank_irq( int scanline, int vblank, int blanked )
266
267void nes_sunsoft_3_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
262268{
263   /* TODO: change to reflect the actual number of cycles spent: both using 114 or cycling 114,114,113
264    produces a 1-line glitch in Fantasy Zone 2: it really requires the counter to be updated each CPU cycle! */
265   if (m_irq_enable)
269   if (id == TIMER_IRQ)
266270   {
267      if (m_irq_count <= 114)
271      if (m_irq_enable)
268272      {
269         m_irq_enable = 0;
270         m_irq_count = 0xffff;
271         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
273         if (!m_irq_count)
274         {
275            machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
276            m_irq_count = 0xffff;
277            m_irq_enable = 0;
278         }
279         else
280            m_irq_count--;
272281      }
273      else
274         m_irq_count -= 114;
275282   }
276283}
277284
r22528r22529
449456
450457 -------------------------------------------------*/
451458
452/* Here, IRQ counter decrements every CPU cycle. Since we update it every scanline,
453 we need to decrement it by 114 (Each scanline consists of 341 dots and, on NTSC,
454 there are 3 dots to every 1 CPU cycle, hence 114 is the number of cycles per scanline ) */
455void nes_sunsoft_fme7_device::hblank_irq( int scanline, int vblank, int blanked )
459void nes_sunsoft_fme7_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
456460{
457   /* TODO: change to reflect the actual number of cycles spent */
458   if ((m_irq_enable & 0x80) && (m_irq_enable & 0x01))
461   if (id == TIMER_IRQ)
459462   {
460      if (m_irq_count <= 114)
463      if ((m_irq_enable & 0x80)) // bit7, counter decrement
461464      {
462         m_irq_count = 0xffff;
463         machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
465         if (!m_irq_count)
466         {
467            m_irq_count = 0xffff;
468            if (m_irq_enable & 0x01) // bit0, trigger enable
469               machine().device("maincpu")->execute().set_input_line(M6502_IRQ_LINE, HOLD_LINE);
470         }
471         else
472            m_irq_count--;
464473      }
465      else
466         m_irq_count -= 114;
467474   }
468   else if (m_irq_enable & 0x01)    // if enable bit 7 is not set, only decrement the counter!
469   {
470      if (m_irq_count <= 114)
471         m_irq_count = 0xffff;
472      else
473         m_irq_count -= 114;
474   }
475475}
476476
477477WRITE8_MEMBER(nes_sunsoft_fme7_device::fme7_write)
trunk/src/mess/machine/nes_sunsoft.h
r22528r22529
4747
4848   // device-level overrides
4949   virtual void device_start();
50   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
5051   virtual DECLARE_WRITE8_MEMBER(write_h);
5152
52   virtual void hblank_irq(int scanline, int vblank, int blanked);
5353   virtual void pcb_reset();
5454
5555private:
56
5756   UINT16 m_irq_count;
5857   int m_irq_enable, m_irq_toggle;
58   
59   static const device_timer_id TIMER_IRQ = 0;
60   emu_timer *irq_timer;
5961};
6062
6163
r22528r22529
9395
9496   // device-level overrides
9597   virtual void device_start();
98   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
9699   virtual DECLARE_READ8_MEMBER(read_m);
97100   virtual DECLARE_WRITE8_MEMBER(write_m);
98101   virtual DECLARE_WRITE8_MEMBER(fme7_write);
99102   virtual DECLARE_WRITE8_MEMBER(write_h) { fme7_write(space, offset, data, mem_mask); }
100103
101   virtual void hblank_irq( int scanline, int vblank, int blanked );
102104   virtual void pcb_reset();
103105
104106private:
105   UINT8 m_latch;
106107   UINT16 m_irq_count;
107108   int m_irq_enable;
108
109   
110   static const device_timer_id TIMER_IRQ = 0;
111   emu_timer *irq_timer;
112   
113   UINT8 m_latch;
109114   UINT8 m_wram_bank;
110115};
111116

Previous 199869 Revisions Next


© 1997-2024 The MAME Team