Previous 199869 Revisions Next

r22588 Sunday 28th April, 2013 at 10:01:32 UTC by Wilbert Pol
(MESS) bbc.c: Hooking up some more serial processor features. Cassette saving is not working yet due to the serial procesor and 6850 not entirely understanding each other yet. (nw)
[src/mess/drivers]bbc.c
[src/mess/includes]bbc.h
[src/mess/machine]bbc.c

trunk/src/mess/machine/bbc.c
r22587r22588
13071307
13081308TIMER_CALLBACK_MEMBER(bbc_state::bbc_tape_timer_cb)
13091309{
1310   double dev_val = m_cassette->input();
1310   if ( m_cass_out_enabled )
1311   {
1312      // 0 = 18-18 18-17-1
1313      // 1 = 9-9-9-9 9-9-9-8-1
13111314
1312   // look for edges on the cassette wave
1313   if (((dev_val>=0.0) && (m_last_dev_val<0.0)) || ((dev_val<0.0) && (m_last_dev_val>=0.0)))
1315      switch ( m_cass_out_samples_to_go )
1316      {
1317         case 0:
1318            if ( m_cass_out_phase == 0 )
1319            {
1320               // get bit value
1321               m_cass_out_bit = m_txd;
1322               if ( m_cass_out_bit )
1323               {
1324                  m_cass_out_phase = 3;
1325                  m_cass_out_samples_to_go = 9;
1326               }
1327               else
1328               {
1329                  m_cass_out_phase = 1;
1330                  m_cass_out_samples_to_go = 18;
1331               }
1332               m_cassette->output( +1.0 );
1333            }
1334            else
1335            {
1336               // switch phase
1337               m_cass_out_phase--;
1338               m_cass_out_samples_to_go = m_cass_out_bit ? 9 : 18;
1339               m_cassette->output( ( m_cass_out_phase & 1 ) ? +1.0 : -1.0 );
1340            }
1341            break;
1342         case 1:
1343            if ( m_cass_out_phase == 0 )
1344            {
1345               m_cassette->output( 0.0 );
1346            }
1347            break;
1348      }
1349
1350      m_cass_out_samples_to_go--;
1351   }
1352   else
13141353   {
1315      if (m_wav_len>(9*3))
1354      double dev_val = m_cassette->input();
1355
1356      // look for edges on the cassette wave
1357      if (((dev_val>=0.0) && (m_last_dev_val<0.0)) || ((dev_val<0.0) && (m_last_dev_val>=0.0)))
13161358      {
1317         //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.
1318         logerror ("Cassette length %d\n",m_wav_len);
1319         m_nr_high_tones = 0;
1320         m_dcd_cass = 0;
1321         m_len0=0;
1322         m_len1=0;
1323         m_len2=0;
1324         m_len3=0;
1325         m_wav_len=0;
1359         if (m_wav_len>(9*3))
1360         {
1361            //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.
1362            logerror ("Cassette length %d\n",m_wav_len);
1363            m_nr_high_tones = 0;
1364            m_dcd_cass = 0;
1365            m_len0=0;
1366            m_len1=0;
1367            m_len2=0;
1368            m_len3=0;
1369            m_wav_len=0;
13261370
1327      }
1371         }
13281372
1329      m_len3=m_len2;
1330      m_len2=m_len1;
1331      m_len1=m_len0;
1332      m_len0=m_wav_len;
1373         m_len3=m_len2;
1374         m_len2=m_len1;
1375         m_len1=m_len0;
1376         m_len0=m_wav_len;
13331377
1334      m_wav_len=0;
1335      logerror ("cassette  %d  %d  %d  %d\n",m_len3,m_len2,m_len1,m_len0);
1378         m_wav_len=0;
1379         logerror ("cassette  %d  %d  %d  %d\n",m_len3,m_len2,m_len1,m_len0);
13361380
1337      if ((m_len0+m_len1)>=(18+18-5))
1338      {
1339         /* Clock a 0 onto the serial line */
1340         logerror("Serial value 0\n");
1341         m_nr_high_tones = 0;
1342         m_dcd_cass = 0;
1343         MC6850_Receive_Clock(0);
1344         m_len0=0;
1345         m_len1=0;
1346         m_len2=0;
1347         m_len3=0;
1348      }
1381         if ((m_len0+m_len1)>=(18+18-5))
1382         {
1383            /* Clock a 0 onto the serial line */
1384            logerror("Serial value 0\n");
1385            m_nr_high_tones = 0;
1386            m_dcd_cass = 0;
1387            MC6850_Receive_Clock(0);
1388            m_len0=0;
1389            m_len1=0;
1390            m_len2=0;
1391            m_len3=0;
1392         }
13491393
1350      if (((m_len0+m_len1+m_len2+m_len3)<=41) && (m_len3!=0))
1351      {
1352         /* Clock a 1 onto the serial line */
1353         logerror("Serial value 1\n");
1354         m_nr_high_tones++;
1355         if ( m_nr_high_tones > 100 )
1394         if (((m_len0+m_len1+m_len2+m_len3)<=41) && (m_len3!=0))
13561395         {
1357            m_dcd_cass = 1;
1396            /* Clock a 1 onto the serial line */
1397            logerror("Serial value 1\n");
1398            m_nr_high_tones++;
1399            if ( m_nr_high_tones > 100 )
1400            {
1401               m_dcd_cass = 1;
1402            }
1403            MC6850_Receive_Clock(1);
1404            m_len0=0;
1405            m_len1=0;
1406            m_len2=0;
1407            m_len3=0;
13581408         }
1359         MC6850_Receive_Clock(1);
1360         m_len0=0;
1361         m_len1=0;
1362         m_len2=0;
1363         m_len3=0;
1409
1410
13641411      }
13651412
1413      m_wav_len++;
1414      m_last_dev_val=dev_val;
1415   }
1416}
13661417
1418
1419WRITE_LINE_MEMBER( bbc_state::bbc_rts_w )
1420{
1421   if ( m_serproc_data & 0x40 )
1422   {
1423      m_cass_out_enabled = 0;
13671424   }
1425   else
1426   {
1427      m_cass_out_enabled = state ? 0 : 1;
1428   }
1429}
13681430
1369   m_wav_len++;
1370   m_last_dev_val=dev_val;
13711431
1432WRITE_LINE_MEMBER( bbc_state::bbc_txd_w )
1433{
1434   m_txd = state;
13721435}
13731436
1437
13741438void bbc_state::BBC_Cassette_motor(unsigned char status)
13751439{
13761440   if (status)
r22587r22588
13871451      m_len2 = 0;
13881452      m_len3 = 0;
13891453      m_wav_len = 0;
1454      m_cass_out_phase = 0;
1455      m_cass_out_samples_to_go = 4;
13901456   }
13911457}
13921458
r22587r22588
13971463// -x-- ---- - Cassette(0)/RS243 input(1)
13981464// --xx x--- - Receive baud rate generator control
13991465// ---- -xxx - Transmit baud rate generator control
1466//             These possible settings apply to both the receive
1467//             and transmit baud generator control bits:
1468//             000 - 16MHz / 13 /   1 - 19200 baud
1469//             001 - 16MHz / 13 /  16 -  1200 baud
1470//             010 - 16MHz / 13 /   4 -  4800 baud
1471//             011 - 16MHz / 13 / 128 -   150 baud
1472//             100 - 16MHz / 13 /   2 -  9600 baud
1473//             101 - 16MHz / 13 /  64 -   300 baud
1474//             110 - 16MHz / 13 /   8 -  2400 baud
1475//             110 - 16MHz / 13 / 256 -    75 baud
14001476//
14011477WRITE8_MEMBER(bbc_state::bbc_SerialULA_w)
14021478{
1479   static const int serial_clocks[8] =
1480   {
1481      XTAL_16MHz / 13 / 1,    // 000
1482      XTAL_16MHz / 13 / 16,   // 001
1483      XTAL_16MHz / 13 / 4,    // 010
1484      XTAL_16MHz / 13 / 128,  // 011
1485      XTAL_16MHz / 13 / 2,    // 100
1486      XTAL_16MHz / 13 / 64,   // 101
1487      XTAL_16MHz / 13 / 8,    // 110
1488      XTAL_16MHz / 13 / 256   // 111
1489   };
1490
14031491   m_serproc_data = data;
14041492   BBC_Cassette_motor(m_serproc_data & 0x80);
1493
1494   // Set transmit clock rate
1495   m_acia->set_tx_clock( serial_clocks[ data & 0x07 ] );
1496
1497   if ( data & 0x40 )
1498   {
1499      // Set receive clock rate
1500      m_acia->set_rx_clock( serial_clocks[ ( data >> 3 ) & 0x07 ] );
1501   }
1502   else
1503   {
1504      m_acia->set_rx_clock( 0 );
1505   }
14051506}
14061507
14071508/**************************************
r22587r22588
19932094   m_cts_rs423 = 1;
19942095   m_nr_high_tones = 0;
19952096   m_serproc_data = 0;
2097   m_cass_out_enabled = 0;
19962098   m_tape_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(bbc_state::bbc_tape_timer_cb),this));
19972099}
19982100
r22587r22588
20052107   m_cts_rs423 = 1;
20062108   m_nr_high_tones = 0;
20072109   m_serproc_data = 0;
2110   m_cass_out_enabled = 0;
20082111   m_tape_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(bbc_state::bbc_tape_timer_cb),this));
20092112}
20102113
trunk/src/mess/includes/bbc.h
r22587r22588
165165   int m_rxd_cass;
166166   int m_rxd_rs423;
167167   int m_cts_rs423;
168   int m_cass_out_enabled;
169   int m_txd;
168170   UINT32 m_nr_high_tones;
171   int m_cass_out_samples_to_go;
172   int m_cass_out_bit;
173   int m_cass_out_phase;
169174   emu_timer *m_tape_timer;
170175
171176
r22587r22588
330335   DECLARE_READ_LINE_MEMBER(bbc_rxd_r) { return ( m_serproc_data & 0x40 ) ? m_rxd_rs423 : m_rxd_cass; }
331336   DECLARE_READ_LINE_MEMBER(bbc_dcd_r) { return ( m_serproc_data & 0x40 ) ? 0 : m_dcd_cass; }
332337   DECLARE_READ_LINE_MEMBER(bbc_cts_r) { return ( m_serproc_data & 0x40 ) ? m_cts_rs423 : 1; }
338   DECLARE_WRITE_LINE_MEMBER(bbc_rts_w);
339   DECLARE_WRITE_LINE_MEMBER(bbc_txd_w);
333340
334341   DECLARE_DEVICE_IMAGE_LOAD_MEMBER( bbcb_cart );
335342
trunk/src/mess/drivers/bbc.c
r22587r22588
743743   0,
744744   0,
745745   DEVCB_DRIVER_LINE_MEMBER(bbc_state,bbc_rxd_r),
746   DEVCB_NULL,
746   DEVCB_DRIVER_LINE_MEMBER(bbc_state,bbc_txd_w),
747747   DEVCB_DRIVER_LINE_MEMBER(bbc_state,bbc_cts_r),
748   DEVCB_NULL,
748   DEVCB_DRIVER_LINE_MEMBER(bbc_state,bbc_rts_w),
749749   DEVCB_DRIVER_LINE_MEMBER(bbc_state,bbc_dcd_r),
750750   DEVCB_DRIVER_LINE_MEMBER(bbc_state,bbcb_acia6850_irq_w)
751751};

Previous 199869 Revisions Next


© 1997-2024 The MAME Team