Previous 199869 Revisions Next

r19893 Friday 28th December, 2012 at 12:07:44 UTC by Jonathan Gevaryahu
Yet another system 11 irq speed fix: Correct the E clock frequency used for the IRQ generation. Hopefully more games will pass their IRQ self-test now. [Lord Nightmare, Barry Rodewald]
[src/mame/drivers]s11.c s11a.c s11b.c

trunk/src/mame/drivers/s11b.c
r19892r19893
1717#include "sound/dac.h"
1818#include "s11b.lh"
1919
20// 6802/8 CPU's input clock is 4MHz
21// but because it has an internal /4 divider, its E clock runs at 1/4 that frequency
22#define E_CLOCK (XTAL_4MHz/4)
23
2024// Length of time in cycles between IRQs on the main 6808 CPU
2125// This length is determined by the settings of the W14 and W15 jumpers
2226// It can be 0x300, 0x380, 0x700 or 0x780 cycles long.
r19892r19893
243247      if(param == 1)
244248      {
245249         m_maincpu->set_input_line(M6800_IRQ_LINE,ASSERT_LINE);
246         m_irq_timer->adjust(attotime::from_ticks(32,XTAL_4MHz),0);
250         m_irq_timer->adjust(attotime::from_ticks(32,E_CLOCK),0);
247251         m_pias->cb1_w(0);
248252         m_irq_active = true;
249253         m_pia28->ca1_w(BIT(ioport("DIAGS")->read(), 2));  // Advance
r19892r19893
252256      else
253257      {
254258         m_maincpu->set_input_line(M6800_IRQ_LINE,CLEAR_LINE);
255         m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,XTAL_4MHz),1);
259         m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,E_CLOCK),1);
256260         m_pias->cb1_w(1);
257261         m_irq_active = false;
258262         m_pia28->ca1_w(1);
r19892r19893
291295   if(state == CLEAR_LINE)
292296   {
293297      // restart IRQ timer
294      m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,XTAL_4MHz),1);
298      m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,E_CLOCK),1);
295299      m_irq_active = false;
296300   }
297301   else
r19892r19893
651655   membank("bgbank")->set_entry(0);
652656   m_invert = false;
653657   m_irq_timer = timer_alloc(TIMER_IRQ);
654   m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,XTAL_4MHz),1);
658   m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,E_CLOCK),1);
655659   m_irq_active = false;
656660}
657661
r19892r19893
667671   membank("bgbank")->set_entry(0);
668672   m_invert = true;
669673   m_irq_timer = timer_alloc(TIMER_IRQ);
670   m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,XTAL_4MHz),1);
674   m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,E_CLOCK),1);
671675   m_irq_active = false;
672676}
673677
trunk/src/mame/drivers/s11a.c
r19892r19893
2727#include "sound/dac.h"
2828#include "s11a.lh"
2929
30// 6802/8 CPU's input clock is 4MHz
31// but because it has an internal /4 divider, its E clock runs at 1/4 that frequency
32#define E_CLOCK (XTAL_4MHz/4)
33
3034// Length of time in cycles between IRQs on the main 6808 CPU
3135// This length is determined by the settings of the W14 and W15 jumpers
3236// It can be 0x300, 0x380, 0x700 or 0x780 cycles long.
3337// IRQ length is always 32 cycles
34#define S11_IRQ_CYCLES 0x700
38#define S11_IRQ_CYCLES 0x380
3539
3640class s11a_state : public genpin_class
3741{
r19892r19893
245249      if(param == 1)
246250      {
247251         m_maincpu->set_input_line(M6800_IRQ_LINE,ASSERT_LINE);
248         m_irq_timer->adjust(attotime::from_ticks(32,XTAL_4MHz),0);
252         m_irq_timer->adjust(attotime::from_ticks(32,E_CLOCK),0);
249253         m_pias->cb1_w(0);
250254         m_irq_active = true;
251255         m_pia28->ca1_w(BIT(ioport("DIAGS")->read(), 2));  // Advance
r19892r19893
254258      else
255259      {
256260         m_maincpu->set_input_line(M6800_IRQ_LINE,CLEAR_LINE);
257         m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,XTAL_4MHz),1);
261         m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,E_CLOCK),1);
258262         m_pias->cb1_w(1);
259263         m_irq_active = false;
260264         m_pia28->ca1_w(1);
r19892r19893
290294   if(state == CLEAR_LINE)
291295   {
292296      // restart IRQ timer
293      m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,XTAL_4MHz),1);
297      m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,E_CLOCK),1);
294298      m_irq_active = false;
295299   }
296300   else
r19892r19893
616620   membank("bank1")->set_entry(0);
617621   membank("bgbank")->set_entry(0);
618622   m_irq_timer = timer_alloc(TIMER_IRQ);
619   m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,XTAL_4MHz),1);
623   m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,E_CLOCK),1);
620624   m_irq_active = false;
621625}
622626
trunk/src/mame/drivers/s11.c
r19892r19893
2222#include "sound/dac.h"
2323#include "s11.lh"
2424
25// 6802/8 CPU's input clock is 4MHz
26// but because it has an internal /4 divider, its E clock runs at 1/4 that frequency
27#define E_CLOCK (XTAL_4MHz/4)
28
2529// Length of time in cycles between IRQs on the main 6808 CPU
2630// This length is determined by the settings of the W14 and W15 jumpers
2731// It can be 0x300, 0x380, 0x700 or 0x780 cycles long.
r19892r19893
235239      if(param == 1)
236240      {
237241         m_maincpu->set_input_line(M6800_IRQ_LINE,ASSERT_LINE);
238         m_irq_timer->adjust(attotime::from_ticks(32,XTAL_4MHz),0);
242         m_irq_timer->adjust(attotime::from_ticks(32,E_CLOCK),0);
239243         m_pias->cb1_w(0);
240244         m_irq_active = true;
241245         m_pia28->ca1_w(BIT(ioport("DIAGS")->read(), 2));  // Advance
r19892r19893
244248      else
245249      {
246250         m_maincpu->set_input_line(M6800_IRQ_LINE,CLEAR_LINE);
247         m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,XTAL_4MHz),1);
251         m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,E_CLOCK),1);
248252         m_pias->cb1_w(1);
249253         m_irq_active = false;
250254         m_pia28->ca1_w(1);
r19892r19893
279283   if(state == CLEAR_LINE)
280284   {
281285      // restart IRQ timer
282      m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,XTAL_4MHz),1);
286      m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,E_CLOCK),1);
283287      m_irq_active = false;
284288   }
285289   else
r19892r19893
591595   membank("bank0")->set_entry(0);
592596   membank("bank1")->set_entry(0);
593597   m_irq_timer = timer_alloc(TIMER_IRQ);
594   m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,XTAL_4MHz),1);
598   m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,E_CLOCK),1);
595599   m_irq_active = false;
596600}
597601

Previous 199869 Revisions Next


© 1997-2024 The MAME Team