Previous 199869 Revisions Next

r22552 Thursday 25th April, 2013 at 18:57:49 UTC by Wilbert Pol
(MESS) bbc.c: Fixed cassette loading.  [Wilbert Pol]
[src/mess/drivers]bbc.c
[src/mess/includes]bbc.h
[src/mess/machine]bbc.c

trunk/src/mess/machine/bbc.c
r22551r22552
564564      if ((myo>=0x00) && (myo<=0x07)) return bbc_6845_r(space, myo-0x00);     /* Video Controller */
565565      if ((myo>=0x08) && (myo<=0x0f))
566566      {
567         acia6850_device *acia = machine().device<acia6850_device>("acia6850");
568
569567         if ((myo - 0x08) & 1)
570            return acia->status_read(space,0);
568            return m_acia->status_read(space,0);
571569         else
572            return acia->data_read(space,0);
570            return m_acia->data_read(space,0);
573571      }
574572      if ((myo>=0x10) && (myo<=0x17)) return 0xfe;                        /* Serial System Chip */
575573      if ((myo>=0x18) && (myo<=0x1f)) return uPD7002_r(machine().device("upd7002"), space, myo-0x18);         /* A to D converter */
r22551r22552
604602      if ((myo>=0x00) && (myo<=0x07)) bbc_6845_w(space, myo-0x00,data);           /* Video Controller */
605603      if ((myo>=0x08) && (myo<=0x0f))
606604      {
607         acia6850_device *acia = machine().device<acia6850_device>("acia6850");
608
609605         if ((myo - 0x08) & 1)
610            acia->control_write(space, 0, data);
606            m_acia->control_write(space, 0, data);
611607         else
612            acia->data_write(space, 0, data);
608            m_acia->data_write(space, 0, data);
613609      }
614610      if ((myo>=0x10) && (myo<=0x17)) bbc_SerialULA_w(space, myo-0x10,data);      /* Serial System Chip */
615611      if ((myo>=0x18) && (myo<=0x1f)) uPD7002_w(machine().device("upd7002"),space,myo-0x18,data);         /* A to D converter */
r22551r22552
12961292
12971293void bbc_state::MC6850_Receive_Clock(int new_clock)
12981294{
1299   if (!m_mc6850_clock && new_clock)
1295   m_rxd = new_clock;
1296
1297   //
1298   // Somehow the "serial processor" generates 16 clock signals towards
1299   // the 6850. Exact details are unknown, faking it with the following
1300   // loop.
1301   //
1302   for (int i = 0; i < 16; i++ )
13001303   {
1301      acia6850_device *acia = machine().device<acia6850_device>("acia6850");
1302      acia->tx_clock_in();
1304      m_acia->rx_clock_in();
13031305   }
1304   m_mc6850_clock = new_clock;
13051306}
13061307
13071308TIMER_CALLBACK_MEMBER(bbc_state::bbc_tape_timer_cb)
13081309{
13091310   double dev_val = m_cassette->input();
13101311
1311   // look for rising edges on the cassette wave
1312   // look for edges on the cassette wave
13121313   if (((dev_val>=0.0) && (m_last_dev_val<0.0)) || ((dev_val<0.0) && (m_last_dev_val>=0.0)))
13131314   {
13141315      if (m_wav_len>(9*3))
13151316      {
13161317         //this is to long to recive anything so reset the serial IC. This is a hack, this should be done as a timer in the MC6850 code.
13171318         logerror ("Cassette length %d\n",m_wav_len);
1319         m_nr_high_tones = 0;
1320         m_dcd = 0;
13181321         m_len0=0;
13191322         m_len1=0;
13201323         m_len2=0;
r22551r22552
13351338      {
13361339         /* Clock a 0 onto the serial line */
13371340         logerror("Serial value 0\n");
1341         m_nr_high_tones = 0;
1342         m_dcd = 0;
13381343         MC6850_Receive_Clock(0);
13391344         m_len0=0;
13401345         m_len1=0;
r22551r22552
13461351      {
13471352         /* Clock a 1 onto the serial line */
13481353         logerror("Serial value 1\n");
1354         m_nr_high_tones++;
1355         if ( m_nr_high_tones > 100 )
1356         {
1357            m_dcd = 1;
1358         }
13491359         MC6850_Receive_Clock(1);
13501360         m_len0=0;
13511361         m_len1=0;
r22551r22552
13841394
13851395WRITE8_MEMBER(bbc_state::bbc_SerialULA_w)
13861396{
1387   BBC_Cassette_motor((data & 0x80) >> 7);
1397   m_serproc_data = data;
1398   BBC_Cassette_motor(m_serproc_data & 0x80);
13881399}
13891400
13901401/**************************************
r22551r22552
19701981DRIVER_INIT_MEMBER(bbc_state,bbc)
19711982{
19721983   m_Master=0;
1984   m_rxd = 0;
1985   m_dcd = 0;
1986   m_txd = 0;
1987   m_cts = 1;
1988   m_nr_high_tones = 0;
1989   m_serproc_data = 0;
19731990   m_tape_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(bbc_state::bbc_tape_timer_cb),this));
19741991}
1992
19751993DRIVER_INIT_MEMBER(bbc_state,bbcm)
19761994{
19771995   m_Master=1;
1996   m_rxd = 0;
1997   m_dcd = 0;
1998   m_txd = 0;
1999   m_cts = 1;
2000   m_nr_high_tones = 0;
2001   m_serproc_data = 0;
19782002   m_tape_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(bbc_state::bbc_tape_timer_cb),this));
19792003}
19802004
trunk/src/mess/includes/bbc.h
r22551r22552
3131      m_sn(*this, "sn76489"),
3232      m_trom(*this, "saa505x"),
3333      m_cassette(*this, "cassette"),
34      m_acia(*this, "acia6850"),
3435      m_ACCCON_IRR(CLEAR_LINE),     
3536      m_via_system_irq(CLEAR_LINE),
3637      m_via_user_irq(CLEAR_LINE),
r22551r22552
5253   optional_device<sn76489_device> m_sn;
5354   required_device<saa5050_device> m_trom;
5455   required_device<cassette_image_device> m_cassette;
56   required_device<acia6850_device> m_acia;
5557
5658   void check_interrupts();
5759
r22551r22552
158160   int m_len2;
159161   int m_len3;
160162   int m_mc6850_clock;
163   UINT8 m_serproc_data;
164   int m_dcd;
165   int m_rxd;
166   int m_txd;
167   int m_cts;
168   UINT32 m_nr_high_tones;
161169   emu_timer *m_tape_timer;
162170
163171
r22551r22552
319327   DECLARE_WRITE_LINE_MEMBER(bbc_wd177x_intrq_w);
320328   DECLARE_WRITE_LINE_MEMBER(bbc_wd177x_drq_w);
321329   DECLARE_WRITE_LINE_MEMBER(bbc_vsync);
330   DECLARE_READ_LINE_MEMBER(bbc_rxd_r) { return m_rxd; }
331   DECLARE_READ_LINE_MEMBER(bbc_dcd_r) { return m_dcd; }
332   DECLARE_READ_LINE_MEMBER(bbc_cts_r) { return m_cts; }
322333
323334   DECLARE_DEVICE_IMAGE_LOAD_MEMBER( bbcb_cart );
324335
trunk/src/mess/drivers/bbc.c
r22551r22552
742742{
743743   0,
744744   0,
745   DEVCB_DRIVER_LINE_MEMBER(bbc_state,bbc_rxd_r),
745746   DEVCB_NULL,
747   DEVCB_DRIVER_LINE_MEMBER(bbc_state,bbc_cts_r),
746748   DEVCB_NULL,
747   DEVCB_NULL,
748   DEVCB_NULL,
749   DEVCB_NULL,
749   DEVCB_DRIVER_LINE_MEMBER(bbc_state,bbc_dcd_r),
750750   DEVCB_DRIVER_LINE_MEMBER(bbc_state,bbcb_acia6850_irq_w)
751751};
752752

Previous 199869 Revisions Next


© 1997-2024 The MAME Team