diff --git a/bochs/iodev/cdrom.cc b/bochs/iodev/cdrom.cc index dceebfaf4..579aae424 100644 --- a/bochs/iodev/cdrom.cc +++ b/bochs/iodev/cdrom.cc @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: cdrom.cc,v 1.86 2005-11-11 22:52:57 vruppert Exp $ +// $Id: cdrom.cc,v 1.87 2005-12-27 13:21:25 vruppert Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2002 MandrakeSoft S.A. @@ -530,7 +530,7 @@ cdrom_interface::cdrom_interface(char *dev) void cdrom_interface::init(void) { - BX_DEBUG(("Init $Id: cdrom.cc,v 1.86 2005-11-11 22:52:57 vruppert Exp $")); + BX_DEBUG(("Init $Id: cdrom.cc,v 1.87 2005-12-27 13:21:25 vruppert Exp $")); BX_INFO(("file = '%s'",path)); } @@ -1476,4 +1476,11 @@ cdrom_interface::read_block(Bit8u* buf, int lba, int blocksize) return (n == BX_CD_FRAMESIZE); } +void cdrom_interface::seek(int lba) +{ + unsigned char buffer[BX_CD_FRAMESIZE]; + + read_block(buffer, lba, BX_CD_FRAMESIZE); +} + #endif /* if BX_SUPPORT_CDROM */ diff --git a/bochs/iodev/cdrom.h b/bochs/iodev/cdrom.h index 8600fa92a..185afb34b 100644 --- a/bochs/iodev/cdrom.h +++ b/bochs/iodev/cdrom.h @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: cdrom.h,v 1.18 2005-11-02 20:26:24 vruppert Exp $ +// $Id: cdrom.h,v 1.19 2005-12-27 13:21:25 vruppert Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2002 MandrakeSoft S.A. @@ -34,24 +34,27 @@ public: ~cdrom_interface(void); void init(void); - // Load CD-ROM. Returns false if CD is not ready. + // Load CD-ROM. Returns 0 if CD is not ready. bx_bool insert_cdrom(char *dev = NULL); // Logically eject the CD. void eject_cdrom(); - // Read CD TOC. Returns false if start track is out of bounds. + // Read CD TOC. Returns 0 if start track is out of bounds. bx_bool read_toc(Bit8u* buf, int* length, bx_bool msf, int start_track, int format); // Return CD-ROM capacity (in 2048 byte frames) Bit32u capacity(); - // Read a single block from the CD + // Read a single block from the CD. Returns 0 on failure. bx_bool read_block(Bit8u* buf, int lba, int blocksize) BX_CPP_AttrRegparmN(3); // Start (spin up) the CD. bx_bool start_cdrom(); + // Seek for new block address. + void seek(int lba); + private: int fd; char *path; diff --git a/bochs/iodev/cdrom_amigaos.cc b/bochs/iodev/cdrom_amigaos.cc index f37cb30d9..54acfcf61 100644 --- a/bochs/iodev/cdrom_amigaos.cc +++ b/bochs/iodev/cdrom_amigaos.cc @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: cdrom_amigaos.cc,v 1.11 2005-12-10 18:37:35 vruppert Exp $ +// $Id: cdrom_amigaos.cc,v 1.12 2005-12-27 13:21:25 vruppert Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2000 MandrakeSoft S.A. @@ -273,3 +273,10 @@ int DoSCSI(UBYTE *data, int datasize, Bit8u *cmd,int cmdsize, UBYTE direction) return CDIO->iotd_Req.io_Error; } + +void cdrom_interface::seek(int lba) +{ + unsigned char buffer[BX_CD_FRAMESIZE]; + + read_block(buffer, lba, BX_CD_FRAMESIZE); +} diff --git a/bochs/iodev/harddrv.cc b/bochs/iodev/harddrv.cc index 90d2c928f..0a6b76760 100644 --- a/bochs/iodev/harddrv.cc +++ b/bochs/iodev/harddrv.cc @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: harddrv.cc,v 1.155 2005-12-10 15:02:25 vruppert Exp $ +// $Id: harddrv.cc,v 1.156 2005-12-27 13:21:25 vruppert Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2002 MandrakeSoft S.A. @@ -144,7 +144,7 @@ bx_hard_drive_c::init(void) char string[5]; char sbtext[8]; - BX_DEBUG(("Init $Id: harddrv.cc,v 1.155 2005-12-10 15:02:25 vruppert Exp $")); + BX_DEBUG(("Init $Id: harddrv.cc,v 1.156 2005-12-27 13:21:25 vruppert Exp $")); for (channel=0; channelget() == 1) { @@ -1810,7 +1810,11 @@ bx_hard_drive_c::write(Bit32u address, Bit32u value, unsigned io_len) raise_interrupt(channel); break; } - BX_INFO(("cdrom: SEEK (ignored)")); +#ifdef LOWLEVEL_CDROM + BX_SELECTED_DRIVE(channel).cdrom.cd->seek(lba); +#else + BX_PANIC(("Seek with no LOWLEVEL_CDROM")); +#endif atapi_cmd_nop(channel); raise_interrupt(channel); }