- seek function added in lowlevel cdrom code (reads a block at specified address)

This commit is contained in:
Volker Ruppert 2005-12-27 13:21:25 +00:00
parent e350c8cb5c
commit 00eabeb2de
4 changed files with 31 additions and 10 deletions

View File

@ -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 */

View File

@ -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;

View File

@ -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);
}

View File

@ -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; channel<BX_MAX_ATA_CHANNEL; channel++) {
if (bx_options.ata[channel].Opresent->get() == 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);
}