Previous 15994 Revisions Next

r6483 Monday 30th November, 2009 at 01:02:23 UTC by Barry Rodewald
[FMTOWNS] Fixed CD-ROM TOC output.
[src/mess/drivers]fmtowns.c

src/mess/drivers/fmtowns.c
r6482r6483
14101410               towns_cd.cmd_status_ptr = 0;
14111411               towns_cd.extra_status = 0;
14121412               towns_cd.cmd_status[0] = 0x00;
1413               towns_cd.cmd_status[1] = 0x00;
1413               towns_cd.cmd_status[1] = 0x01; // CD-ROM/CD-DA status?  bit 1 = error type(HE or CDR)
14141414               towns_cd.cmd_status[2] = 0x00;
14151415               towns_cd.cmd_status[3] = 0x00;
14161416               towns_cdrom_set_irq(device->machine,TOWNS_CD_IRQ_MPU,1);
r6482r6483
14311431            }
14321432            logerror("CD: Command 0x81: set state (CDDASET)\n");
14331433            break;
1434         case 0x84:   // Stop audio track (?)
1435            if(towns_cd.command & 0x20)
1436            {
1437               towns_cd.status |= 0x02;  // status read request
1438               towns_cd.cmd_status_ptr = 0;
1439               towns_cd.extra_status = 0;
1440               towns_cd.cmd_status[0] = 0x00;
1441               towns_cd.cmd_status[1] = 0x00;
1442               towns_cd.cmd_status[2] = 0x00;
1443               towns_cd.cmd_status[3] = 0x00;
1444               towns_cdrom_set_irq(device->machine,TOWNS_CD_IRQ_MPU,1);
1445            }
1446            logerror("CD: Command 0x84: Stop audio track(?)\n");
1447            break;
14341448         default:
14351449            towns_cd.status |= 0x02;  // status read request
14361450            towns_cd.cmd_status_ptr = 0;
r6482r6483
14551469static READ8_HANDLER(towns_cdrom_r)
14561470{
14571471   UINT32 addr = 0;
1458   
1472   UINT8 ret = 0;
14591473   switch(offset)
14601474   {
14611475      case 0x00:  // status
14621476         //logerror("CD: status read, returning %02x\n",towns_cd.status);
14631477         return towns_cd.status;
14641478      case 0x01:  // command status
1465         if(towns_cd.cmd_status_ptr > 3)
1479         if(towns_cd.cmd_status_ptr >= 3)
14661480         {
1467            towns_cd.cmd_status_ptr = 0;
14681481            towns_cd.status &= ~0x02;
14691482            // check for more status bytes
14701483            if(towns_cd.extra_status != 0)
r6482r6483
15251538                           break;
15261539                        case 6:  // st1/2/3 = address of track 0xaa? (BCD)
15271540                           addr = cdrom_get_track_start(mess_cd_get_cdrom_file(devtag_get_device(space->machine,"cdrom")),0xaa);
1528                           addr = dword_to_bcd(addr);
1541                           addr = lba_to_msf(addr);
15291542                           towns_cd.cmd_status[0] = 0x17;
15301543                           towns_cd.cmd_status[1] = (addr & 0xff0000) >> 16;
15311544                           towns_cd.cmd_status[2] = (addr & 0x00ff00) >> 8;
r6482r6483
15361549                           if(towns_cd.extra_status & 0x01)
15371550                           {
15381551                              towns_cd.cmd_status[0] = 0x16;
1539                              towns_cd.cmd_status[1] = cdrom_get_adr_control(mess_cd_get_cdrom_file(devtag_get_device(space->machine,"cdrom")),(towns_cd.extra_status/2)-2);
1540                              towns_cd.cmd_status[2] = (towns_cd.extra_status/2)-2;
1552                              towns_cd.cmd_status[1] = (cdrom_get_adr_control(mess_cd_get_cdrom_file(devtag_get_device(space->machine,"cdrom")),(towns_cd.extra_status/2)-3) & 0x0f) << 4;
1553                              towns_cd.cmd_status[1] |= (cdrom_get_adr_control(mess_cd_get_cdrom_file(devtag_get_device(space->machine,"cdrom")),(towns_cd.extra_status/2)-3) & 0xf0) >> 4;
1554                              towns_cd.cmd_status[2] = (towns_cd.extra_status/2)-3;
15411555                              towns_cd.cmd_status[3] = 0x00;
15421556                              towns_cd.extra_status++;
15431557                           }
15441558                           else
15451559                           {
1546                              addr = cdrom_get_track_start(mess_cd_get_cdrom_file(devtag_get_device(space->machine,"cdrom")),(towns_cd.extra_status/2)-3);
1547                              addr = dword_to_bcd(addr);
1560                              addr = cdrom_get_track_start(mess_cd_get_cdrom_file(devtag_get_device(space->machine,"cdrom")),(towns_cd.extra_status/2)-4);
1561                              addr = lba_to_msf(addr);
15481562                              towns_cd.cmd_status[0] = 0x17;
15491563                              towns_cd.cmd_status[1] = (addr & 0xff0000) >> 16;
15501564                              towns_cd.cmd_status[2] = (addr & 0x00ff00) >> 8;
r6482r6483
15521566                              if(((towns_cd.extra_status/2)-3) >= cdrom_get_last_track(mess_cd_get_cdrom_file(devtag_get_device(space->machine,"cdrom"))))
15531567                              {
15541568                                 towns_cd.extra_status = 0;
1555                                 towns_cd.status &= ~0x02;
15561569                              }
15571570                              else
15581571                                 towns_cd.extra_status++;
r6482r6483
15601573                           break;
15611574                     }
15621575                     break;
1576                  case 0x84:
1577                     towns_cd.cmd_status[0] = 0x07;
1578                     towns_cd.cmd_status[1] = 0x00;
1579                     towns_cd.cmd_status[2] = 0x00;
1580                     towns_cd.cmd_status[3] = 0x00;
1581                     towns_cd.extra_status = 0;
1582                     break;
15631583               }
15641584            }
15651585         }
15661586         logerror("CD: reading command status port, returning %02x\n",towns_cd.cmd_status[towns_cd.cmd_status_ptr]);
1567         return towns_cd.cmd_status[towns_cd.cmd_status_ptr++];
1587         ret = towns_cd.cmd_status[towns_cd.cmd_status_ptr++];
1588         if(towns_cd.cmd_status_ptr > 3)
1589            towns_cd.cmd_status_ptr = 0;
1590         return ret;
15681591      default:
15691592         return 0x00;
15701593   }

Previous 15994 Revisions Next


© 1998-2018 The MESS Team