Previous 199869 Revisions Next

r31206 Sunday 6th July, 2014 at 19:44:19 UTC by Mike Naberezny
(MESS) corvushd: Use Corvus drive id numbers throughout. (nw)
Using the Corvus id number consistently throughout makes it easier to reason
about this code.  Previously, some functions used a 0-based drive index
(0..14) and others used the 1-based Corvus id number (1..15).  The only
place we actually need it to be 0-based is in corvus_hdc_file(), so now we
just convert it there instead of in several places.
[src/emu/machine]corvushd.c

trunk/src/emu/machine/corvushd.c
r31205r31206
255255// Write a variably-sized chunk of data to the CHD file
256256//
257257// Pass:
258//      drv:    Drive number to write to
258//      drv:    Corvus drive id (1..15)
259259//      sector: Physical sector number to write to
260260//      buffer: Buffer to write
261261//      len:    Length of the buffer (amount of data to write)
r31205r31206
323323//
324324UINT8 corvus_hdc_t::corvus_write_logical_sector(dadr_t *dadr, UINT8 *buffer, int len) {
325325   UINT8   status;             // Status returned from Physical Sector read
326   UINT8   drv;                // Drive number (1 - 15)
326   UINT8   drv;                // Corvus drive id (1..15)
327327   UINT32  sector;             // Sector number on drive
328328
329329   //
r31205r31206
334334   //
335335   // For example: 0x23 would decode to Drive ID #3, high-order nibble: 0x02.
336336   //
337   drv = (dadr->address_msn_and_drive & 0x0f) - 1;
337   drv = (dadr->address_msn_and_drive & 0x0f);
338338   sector = (dadr->address_msn_and_drive & 0xf0 << 12) | (dadr->address_mid << 8) | dadr->address_lsb;
339339
340340   LOG(("corvus_write_logical_sector: Writing based on DADR: 0x%6.6x, logical sector: 0x%5.5x, drive: %d\n",
341341      dadr->address_msn_and_drive << 16 | dadr->address_lsb << 8 | dadr->address_mid, sector, drv));
342342
343   // Set up the global corvus_hdc so m_tracks_per_cylinder and m_sectors_per_track are valid
343   // Set m_tracks_per_cylinder and m_sectors_per_track
344344   corvus_hdc_file(drv);
345345
346346   //
r31205r31206
363363// Read a variably-sized chunk of data from the CHD file
364364//
365365// Pass:
366//      drv:    Drive number to read from
366//      drv:    Corvus drive id (1..15)
367367//      sector: Physical sector number to read from
368368//      buffer: Buffer to hold the data read from the disk
369369//      len:    Length of the buffer
r31205r31206
420420//
421421UINT8 corvus_hdc_t::corvus_read_logical_sector(dadr_t *dadr, UINT8 *buffer, int len) {
422422   UINT8   status;                             // Status returned from Physical Sector read
423   UINT8   drv;                                // Drive number (1 - 15)
423   UINT8   drv;                                // Corvus drive id (1..15)
424424   UINT32  sector;                             // Sector number on drive
425425
426426   //
r31205r31206
431431   //
432432   // For example: 0x23 would decode to Drive ID #3, high-order nibble: 0x02.
433433   //
434   drv = (dadr->address_msn_and_drive & 0x0f) - 1;
434   drv = (dadr->address_msn_and_drive & 0x0f);
435435   sector = (dadr->address_msn_and_drive & 0xf0 << 12) | (dadr->address_mid << 8) | dadr->address_lsb;
436436
437437   LOG(("corvus_read_logical_sector: Reading based on DADR: 0x%6.6x, logical sector: 0x%5.5x, drive: %d\n",
438438      dadr->address_msn_and_drive << 16 | dadr->address_lsb << 8 | dadr->address_mid, sector, drv));
439439
440   // Set up the global corvus_hdc so m_tracks_per_cylinder and m_sectors_per_track are valid
440   // Set up m_tracks_per_cylinder and m_sectors_per_track
441441   corvus_hdc_file(drv);
442442
443443   //
r31205r31206
480480   //
481481   // Read the semaphore table from the drive
482482   //
483   status = corvus_read_sector(0, 7, semaphore_table.semaphore_block.semaphore_table, 256);
483   status = corvus_read_sector(1, 7, semaphore_table.semaphore_block.semaphore_table, 256);
484484   if(status != STAT_SUCCESS) {
485485      logerror("corvus_lock_semaphore: Error reading semaphore table, status: 0x%2.2x\n", status);
486486      m_buffer.semaphore_locking_response.result = SEM_DISK_ERROR;
r31205r31206
514514      } else {
515515         m_buffer.semaphore_locking_response.result = SEM_PRIOR_STATE_NOT_SET;          // It wasn't there already
516516         memcpy(&semaphore_table.semaphore_block.semaphore_entry[blank_offset], name, 8);// Stick it into the table
517         status = corvus_write_sector(0, 7, semaphore_table.semaphore_block.semaphore_table, 256);
517         status = corvus_write_sector(1, 7, semaphore_table.semaphore_block.semaphore_table, 256);
518518         if(status != STAT_SUCCESS) {
519519            logerror("corvus_lock_semaphore: Error updating semaphore table, status: 0x%2.2x\n", status);
520520            m_buffer.semaphore_locking_response.result = SEM_DISK_ERROR;
r31205r31206
554554   //
555555   // Read the semaphore table from the drive
556556   //
557   status = corvus_read_sector(0, 7, semaphore_table.semaphore_block.semaphore_table, 256);
557   status = corvus_read_sector(1, 7, semaphore_table.semaphore_block.semaphore_table, 256);
558558   if(status != STAT_SUCCESS) {
559559      logerror("corvus_unlock_semaphore: Error reading semaphore table, status: 0x%2.2x\n", status);
560560      m_buffer.semaphore_locking_response.result = SEM_DISK_ERROR;
r31205r31206
584584   } else {
585585      m_buffer.semaphore_locking_response.result = SEM_PRIOR_STATE_SET;                  // It was there
586586      memcpy(&semaphore_table.semaphore_block.semaphore_entry[offset], "        ", 8);    // Clear it
587      status = corvus_write_sector(0, 7, semaphore_table.semaphore_block.semaphore_table, 256);
587      status = corvus_write_sector(1, 7, semaphore_table.semaphore_block.semaphore_table, 256);
588588      if(status != STAT_SUCCESS) {
589589         logerror("corvus_unlock_semaphore: Error updating semaphore table, status: 0x%2.2x\n", status);
590590         m_buffer.semaphore_locking_response.result = SEM_DISK_ERROR;
r31205r31206
616616
617617   memset(semaphore_table.semaphore_block.semaphore_table, 0x20, 256);
618618
619   status = corvus_write_sector(0, 7, semaphore_table.semaphore_block.semaphore_table, 256);
619   status = corvus_write_sector(1, 7, semaphore_table.semaphore_block.semaphore_table, 256);
620620   if(status != STAT_SUCCESS) {
621621      logerror("corvus_init_semaphore_table: Error updating semaphore table, status: 0x%2.2x\n", status);
622622      return status;
r31205r31206
633633// Fills in the Drive Parameter packet based on the opened CHD file
634634//
635635// Pass:
636//      drv:    Drive number to get parameters from
636//      drv:    Corvus drive id (1..15)
637637//
638638// Returns:
639639//      Status of command
r31205r31206
658658   //
659659   // Make sure a valid drive is being accessed
660660   //
661   drv -= 1;                                   // Internally, drives start at 0
662
663661   if ( ! corvus_hdc_file( drv ) )
664662   {
665663      logerror("corvus_get_drive_parameters: Attempt to retrieve parameters from non-existant drive: %d\n", drv);
r31205r31206
730728   memcpy(m_buffer.drive_param_response.table_info.lsi11_vdo_table, raw_disk_parameter_block.dpb.lsi11_vdo_table, 8);
731729   memcpy(m_buffer.drive_param_response.table_info.lsi11_spare_table, raw_disk_parameter_block.dpb.lsi11_spare_table, 8);
732730
733   m_buffer.drive_param_response.drive_number = drv + 1;
731   m_buffer.drive_param_response.drive_number = drv;
734732   m_buffer.drive_param_response.physical_capacity.msb = (raw_capacity & 0xff0000) >> 16;
735733   m_buffer.drive_param_response.physical_capacity.midb = (raw_capacity & 0x00ff00) >> 8;
736734   m_buffer.drive_param_response.physical_capacity.lsb = (raw_capacity & 0x0000ff);
r31205r31206
757755UINT8 corvus_hdc_t::corvus_read_boot_block(UINT8 block) {
758756   LOG(("corvus_read_boot_block: Reading boot block: %d\n", block));
759757
760   return corvus_read_sector(0, 25 + block, m_buffer.read_512_response.data, 512);
761
758   return corvus_read_sector(1, 25 + block, m_buffer.read_512_response.data, 512);
762759}
763760
764761
r31205r31206
784781   LOG(("corvus_read_firmware_block: Reading firmware head: 0x%2.2x, sector: 0x%2.2x, relative_sector: 0x%2.2x\n",
785782      head, sector, relative_sector));
786783
787   status = corvus_read_sector(0, relative_sector, m_buffer.read_512_response.data, 512);        // TODO: Which drive should Prep Mode talk to ???
784   status = corvus_read_sector(1, relative_sector, m_buffer.read_512_response.data, 512);        // TODO: Which drive should Prep Mode talk to ???
788785   return status;
789786}
790787
r31205r31206
812809   LOG(("corvus_write_firmware_block: Writing firmware head: 0x%2.2x, sector: 0x%2.2x, relative_sector: 0x%2.2x\n",
813810      head, sector, relative_sector));
814811
815   status = corvus_write_sector(0, relative_sector, buffer, 512); // TODO: Which drive should Prep Mode talk to ???
812   status = corvus_write_sector(1, relative_sector, buffer, 512); // TODO: Which drive should Prep Mode talk to ???
816813   return status;
817814}
818815
r31205r31206
835832   UINT8   status = 0;
836833   UINT8   tbuffer[512];
837834
838   // Set up the global corvus_hdc so m_tracks_per_cylinder and m_sectors_per_track are valid
839   corvus_hdc_file(0);
835   // Set up m_tracks_per_cylinder and m_sectors_per_track
836   corvus_hdc_file(1);
840837
841838   max_sector = m_sectors_per_track * m_tracks_per_cylinder * m_cylinders_per_drive;
842839
r31205r31206
848845      pattern = tbuffer;
849846   }
850847
851   LOG(("corvus_format_drive: Formatting drive with 0x%5.5x sectors, pattern buffer (passed length: %d)follows\n", max_sector, 512));
848   LOG(("corvus_format_drive: Formatting drive with 0x%5.5x sectors, pattern buffer (passed length: %d) follows\n", max_sector, 512));
852849   LOG_BUFFER(pattern, 512);
853850
854851   for(sector = 0; sector <= max_sector; sector++) {
855      status = corvus_write_sector(0, sector, pattern, 512);
852      status = corvus_write_sector(1, sector, pattern, 512);
856853      if(status != STAT_SUCCESS) {
857854         logerror("corvus_format_drive: Error while formatting drive in corvus_write_sector--sector: 0x%5.5x, status: 0x%x2.2x\n",
858855            sector, status);
r31205r31206
871868// Returns a hard_disk_file object for a given virtual hard drive device in the concept
872869//
873870// Pass:
874//      id:     Drive number (1 - 15)
871//      drv:    Corvus drive id (1..15)
875872//
876873// Returns:
877874//      hard_disk_file object
878875//
879hard_disk_file *corvus_hdc_t::corvus_hdc_file(int id) {
876hard_disk_file *corvus_hdc_t::corvus_hdc_file(int drv) {
880877   static const char *const tags[] = {
881878      "harddisk1", "harddisk2", "harddisk3", "harddisk4"
882879   };
883880
884881   // we only support 4 drives, as per the tags[] table, so prevent a crash
885   if (id > 3)
882   // Corvus drive id numbers are 1-based so we check 1..4 instead of 0..3
883   if (drv < 1 || drv > 4)
886884   {
887885      return NULL;
888886   }
889887
890   harddisk_image_device *img = siblingdevice<harddisk_image_device>(tags[id]);
888   harddisk_image_device *img = siblingdevice<harddisk_image_device>(tags[drv - 1]);
891889
892890   if ( !img )
893891      return NULL;
r31205r31206
902900   m_tracks_per_cylinder = info->heads;
903901   m_cylinders_per_drive = info->cylinders;
904902
905   LOG(("corvus_hdc_file: Attached to drive %u image: H:%d, C:%d, S:%d\n", id, info->heads, info->cylinders, info->sectors));
903   LOG(("corvus_hdc_file: Attached to drive %u image: H:%d, C:%d, S:%d\n", drv, info->heads, info->cylinders, info->sectors));
906904
907905   return file;
908906}
r31205r31206
979977                     break;
980978                  case SEMAPHORE_STATUS_MOD:
981979                     m_buffer.semaphore_status_response.status =
982                        corvus_read_sector(0, 7, m_buffer.semaphore_status_response.table, 256);
980                        corvus_read_sector(1, 7, m_buffer.semaphore_status_response.table, 256);
983981                     break;
984982                  default:
985983                     invalid_command_flag = true;

Previous 199869 Revisions Next


© 1997-2024 The MAME Team