From f3d7cd9dd7ab51c7d994fd676991f7a53a5d54ac Mon Sep 17 00:00:00 2001 From: Maxim Poliakovski Date: Mon, 15 Jul 2024 01:45:35 +0200 Subject: [PATCH] cdromdrive: add support for raw CD images. --- devices/storage/cdromdrive.cpp | 30 ++++++++++++++++++++++++++++-- devices/storage/cdromdrive.h | 2 ++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/devices/storage/cdromdrive.cpp b/devices/storage/cdromdrive.cpp index 6666467..19839f3 100644 --- a/devices/storage/cdromdrive.cpp +++ b/devices/storage/cdromdrive.cpp @@ -30,12 +30,15 @@ along with this program. If not, see . #include #include -CdromDrive::CdromDrive() : BlockStorageDevice(31, 2048, 0xfffffffe) { +CdromDrive::CdromDrive() : BlockStorageDevice(31, CDR_STD_DATA_SIZE, 0xfffffffe) { this->is_writeable = false; } void CdromDrive::insert_image(std::string filename) { - this->set_host_file(filename); + if (this->set_host_file(filename) < 0) + ABORT_F("Could not open CD-ROM image file, %s", filename.c_str()); + + this->detect_raw_image(); // create single track descriptor this->tracks[0] = {1, /*.trk_num*/ 0x14, /*.adr_ctrl*/ 0 /*.start_lba*/}; @@ -46,6 +49,29 @@ void CdromDrive::insert_image(std::string filename) { static_cast(this->size_blocks + 1) /*.start_lba*/}; } +bool CdromDrive::detect_raw_image() { + uint8_t block_hdr[16]; + + // let's see if the image data starts with the Mode 1/2 sync pattern + this->img_file.read(block_hdr, 0, sizeof(block_hdr)); + + for (int i = 1; i <= 10; i++) + if (block_hdr[i] != 0xFF) + return false; + + if (block_hdr[0] != 0 || block_hdr[11] != 0) + return false; + + // for now, we only support Mode 1 images + if (block_hdr[15] == 1) { + this->set_block_size(2352); + this->data_offset = 16; + return true; + } + + return false; +} + static char cdrom_vendor_dingus_id[] = "DINGUS "; static char cdrom_product_id[] = "DINGUS CD-ROM "; static char cdrom_revision_id[] = "1.0 "; diff --git a/devices/storage/cdromdrive.h b/devices/storage/cdromdrive.h index f487827..a01d6b1 100644 --- a/devices/storage/cdromdrive.h +++ b/devices/storage/cdromdrive.h @@ -46,6 +46,7 @@ typedef struct { #define CDROM_MAX_TRACKS 100 #define LEAD_OUT_TRK_NUM 0xAA +#define CDR_STD_DATA_SIZE 2048 class CdromDrive : public BlockStorageDevice { public: @@ -71,6 +72,7 @@ protected: std::function set_error; uint8_t hex_to_bcd(const uint8_t val); AddrMsf lba_to_msf(const int lba); + bool detect_raw_image(); TrackDescriptor tracks[CDROM_MAX_TRACKS]; int num_tracks;