trunk/src/mess/machine/bbc.c
| r22587 | r22588 | |
| 1307 | 1307 | |
| 1308 | 1308 | TIMER_CALLBACK_MEMBER(bbc_state::bbc_tape_timer_cb) |
| 1309 | 1309 | { |
| 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 |
| 1311 | 1314 | |
| 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 |
| 1314 | 1353 | { |
| 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))) |
| 1316 | 1358 | { |
| 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; |
| 1326 | 1370 | |
| 1327 | | } |
| 1371 | } |
| 1328 | 1372 | |
| 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; |
| 1333 | 1377 | |
| 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); |
| 1336 | 1380 | |
| 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 | } |
| 1349 | 1393 | |
| 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)) |
| 1356 | 1395 | { |
| 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; |
| 1358 | 1408 | } |
| 1359 | | MC6850_Receive_Clock(1); |
| 1360 | | m_len0=0; |
| 1361 | | m_len1=0; |
| 1362 | | m_len2=0; |
| 1363 | | m_len3=0; |
| 1409 | |
| 1410 | |
| 1364 | 1411 | } |
| 1365 | 1412 | |
| 1413 | m_wav_len++; |
| 1414 | m_last_dev_val=dev_val; |
| 1415 | } |
| 1416 | } |
| 1366 | 1417 | |
| 1418 | |
| 1419 | WRITE_LINE_MEMBER( bbc_state::bbc_rts_w ) |
| 1420 | { |
| 1421 | if ( m_serproc_data & 0x40 ) |
| 1422 | { |
| 1423 | m_cass_out_enabled = 0; |
| 1367 | 1424 | } |
| 1425 | else |
| 1426 | { |
| 1427 | m_cass_out_enabled = state ? 0 : 1; |
| 1428 | } |
| 1429 | } |
| 1368 | 1430 | |
| 1369 | | m_wav_len++; |
| 1370 | | m_last_dev_val=dev_val; |
| 1371 | 1431 | |
| 1432 | WRITE_LINE_MEMBER( bbc_state::bbc_txd_w ) |
| 1433 | { |
| 1434 | m_txd = state; |
| 1372 | 1435 | } |
| 1373 | 1436 | |
| 1437 | |
| 1374 | 1438 | void bbc_state::BBC_Cassette_motor(unsigned char status) |
| 1375 | 1439 | { |
| 1376 | 1440 | if (status) |
| r22587 | r22588 | |
| 1387 | 1451 | m_len2 = 0; |
| 1388 | 1452 | m_len3 = 0; |
| 1389 | 1453 | m_wav_len = 0; |
| 1454 | m_cass_out_phase = 0; |
| 1455 | m_cass_out_samples_to_go = 4; |
| 1390 | 1456 | } |
| 1391 | 1457 | } |
| 1392 | 1458 | |
| r22587 | r22588 | |
| 1397 | 1463 | // -x-- ---- - Cassette(0)/RS243 input(1) |
| 1398 | 1464 | // --xx x--- - Receive baud rate generator control |
| 1399 | 1465 | // ---- -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 |
| 1400 | 1476 | // |
| 1401 | 1477 | WRITE8_MEMBER(bbc_state::bbc_SerialULA_w) |
| 1402 | 1478 | { |
| 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 | |
| 1403 | 1491 | m_serproc_data = data; |
| 1404 | 1492 | 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 | } |
| 1405 | 1506 | } |
| 1406 | 1507 | |
| 1407 | 1508 | /************************************** |
| r22587 | r22588 | |
| 1993 | 2094 | m_cts_rs423 = 1; |
| 1994 | 2095 | m_nr_high_tones = 0; |
| 1995 | 2096 | m_serproc_data = 0; |
| 2097 | m_cass_out_enabled = 0; |
| 1996 | 2098 | m_tape_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(bbc_state::bbc_tape_timer_cb),this)); |
| 1997 | 2099 | } |
| 1998 | 2100 | |
| r22587 | r22588 | |
| 2005 | 2107 | m_cts_rs423 = 1; |
| 2006 | 2108 | m_nr_high_tones = 0; |
| 2007 | 2109 | m_serproc_data = 0; |
| 2110 | m_cass_out_enabled = 0; |
| 2008 | 2111 | m_tape_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(bbc_state::bbc_tape_timer_cb),this)); |
| 2009 | 2112 | } |
| 2010 | 2113 | |