Previous 199869 Revisions Next

r25353 Monday 16th September, 2013 at 19:00:45 UTC by Curt Coder
(MESS) c128: Added support for double-sided Commodore GCR images to be used with the 1571 disk drive. Images can be created with e.g. "copy /b side0.g64+side1.g64 disk.g71" [Curt Coder]
[src/lib/formats]d64_dsk.c g64_dsk.c g64_dsk.h
[src/mess/machine]64h156.c c1571.c

trunk/src/lib/formats/d64_dsk.c
r25352r25353
826826
827827      memset(((UINT8*)buffer) + gcr_track_size, speed_byte, G64_SPEED_BLOCK_SIZE);
828828
829      LOG_FORMATS("D64 track %.1f length %u\n", get_dos_track(track), gcr_track_size);
829      LOG_FORMATS("D64 side %u track %.1f length %u\n", head, get_dos_track(track), gcr_track_size);
830830   }
831831   else    /* half tracks */
832832   {
833833      /* set track length to 0 */
834834      memset(buffer, 0, buflen);
835835
836      LOG_FORMATS("D64 track %.1f length %u\n", get_dos_track(track), 0);
836      LOG_FORMATS("D64 side %u track %.1f length %u\n", head, get_dos_track(track), 0);
837837   }
838838
839839   return FLOPPY_ERROR_SUCCESS;
trunk/src/lib/formats/g64_dsk.c
r25352r25353
196196***************************************************************************/
197197
198198#define HEADER_LENGTH       0x2ac           // standard length for 84 half tracks
199#define MAX_HEADS         2
199200#define MAX_TRACKS          84
200201
201202/***************************************************************************
r25352r25353
205206struct g64dsk_tag
206207{
207208   int version;
208   int heads;                              // number of physical heads
209   int tracks;                             // number of physical tracks
210   UINT16 track_size[MAX_TRACKS];          // size of each track
211   UINT32 track_offset[MAX_TRACKS];        // offset within data for each track
212   UINT32 speed_zone_offset[MAX_TRACKS];   // offset within data for each track
209   int heads;                                       // number of physical heads
210   int tracks;                                      // number of physical tracks
211   UINT16 track_size[MAX_HEADS][MAX_TRACKS];            // size of each track
212   UINT32 track_offset[MAX_HEADS][MAX_TRACKS];           // offset within data for each track
213   UINT32 speed_zone_offset[MAX_HEADS][MAX_TRACKS];     // offset within data for each track
213214};
214215
215216/***************************************************************************
r25352r25353
260261   struct g64dsk_tag *tag = get_tag(floppy);
261262   UINT64 offs = 0;
262263
263   if ((track < 0) || (track >= tag->tracks))
264   if ((track < 0) || (track >= MAX_TRACKS))
264265      return FLOPPY_ERROR_SEEKERROR;
265266
266   offs = tag->track_offset[track];
267   offs = tag->track_offset[head][track];
267268
268269   if (offset)
269270      *offset = offs;
r25352r25353
317318   struct g64dsk_tag *tag = get_tag(floppy);
318319   floperr_t err;
319320   UINT64 track_offset;
320   UINT16 track_length = tag->track_size[track];
321   UINT16 track_length = tag->track_size[head][track];
321322
322323   // get track offset
323324   err = get_track_offset(floppy, head, track, &track_offset);
r25352r25353
325326   if (err)
326327      return err;
327328
328   if (!head && track_offset)
329   if ((head <= tag->heads) && track_offset)
329330   {
330331      if (buflen < track_length) { printf("G64 track buffer too small: %u < %u!", (UINT32)buflen, track_length); exit(-1); }
331332
332333      // read track data
333334      floppy_image_read(floppy, ((UINT8*)buffer), track_offset + 2, track_length); // skip the 2 track length bytes in the beginning of track data
334335
335      if (tag->speed_zone_offset[track] > 3)
336      if (tag->speed_zone_offset[head][track] > 3)
336337      {
337338         // read speed block
338         floppy_image_read(floppy, ((UINT8*)buffer) + track_length, tag->speed_zone_offset[track], G64_SPEED_BLOCK_SIZE);
339         floppy_image_read(floppy, ((UINT8*)buffer) + track_length, tag->speed_zone_offset[head][track], G64_SPEED_BLOCK_SIZE);
339340      }
340341      else
341342      {
342343         // create a speed block with the same speed zone for the whole track
343         UINT8 speed = tag->speed_zone_offset[track] & 0x03;
344         UINT8 speed = tag->speed_zone_offset[head][track] & 0x03;
344345         UINT8 speed_byte = (speed << 6) | (speed << 4) | (speed << 2) | speed;
345346
346347         memset(((UINT8*)buffer) + track_length, speed_byte, G64_SPEED_BLOCK_SIZE);
347348      }
349
350      LOG_FORMATS("G64 side %u track %.1f length %u\n", head, get_dos_track(track), track_length);
348351   }
349352   else
350353   {
351354      // no data for given track, or tried to read side 1
352355      memset(((UINT8*)buffer), 0, buflen);
356
357      LOG_FORMATS("G64 side %u track %.1f\n", head, get_dos_track(track));
353358   }
354359
355   LOG_FORMATS("G64 track %.1f length %u\n", get_dos_track(track), track_length);
356
357360   return FLOPPY_ERROR_SUCCESS;
358361}
359362
r25352r25353
424427
425428*/
426429
427FLOPPY_CONSTRUCT( g64_dsk_construct )
430static void read_g64_header(floppy_image_legacy *floppy, struct g64dsk_tag *tag, int head, UINT64 &pos)
428431{
429   struct FloppyCallbacks *callbacks;
430   struct g64dsk_tag *tag;
431432   UINT8 header[HEADER_LENGTH];
432   UINT64 pos = 0xc;
433   int i;
434433
435   if (params)
436   {
437      // create not supported
438      return FLOPPY_ERROR_UNSUPPORTED;
439   }
434   UINT64 start_pos = pos;
440435
441   tag = (struct g64dsk_tag *) floppy_create_tag(floppy, sizeof(struct g64dsk_tag));
442
443   if (!tag) return FLOPPY_ERROR_OUTOFMEMORY;
444
445436   // read header
446   floppy_image_read(floppy, header, 0, HEADER_LENGTH);
437   floppy_image_read(floppy, header, pos, HEADER_LENGTH);
447438
448439   // get version
449440   tag->version = header[8];
450   LOG_FORMATS("G64 version: %u\n", tag->version);
441   if (!head) LOG_FORMATS("G64 version: %u\n", tag->version);
451442
452443   // get number of tracks
453   tag->heads = 1;
454444   tag->tracks = header[9];
455   LOG_FORMATS("G64 tracks: %u\n", tag->tracks);
445   LOG_FORMATS("G64 side %u tracks: %u\n", head, tag->tracks);
456446
447   // get track size
448   UINT16 track_size = (header[0xb] << 8) | header[0xa];
449
457450   // get data offsets
458   for (i = 0; i < tag->tracks; i++)
451   pos = 0xc;
452   for (int i = 0; i < tag->tracks; i++)
459453   {
460      tag->track_offset[i] = pick_integer_le(header, pos, 4);
454      tag->track_offset[head][i] = pick_integer_le(header, pos, 4);
455
456      if (tag->track_offset[head][i])
457      {
458         tag->track_offset[head][i] += start_pos;
459      }
460
461461      pos += 4;
462462   }
463463
464464   // get speed zone information
465   for (i = 0; i < tag->tracks; i++)
465   UINT32 track_offs = 0;
466   for (int i = 0; i < tag->tracks; i++)
466467   {
467      tag->speed_zone_offset[i] = pick_integer_le(header, pos, 4);
468      tag->speed_zone_offset[head][i] = pick_integer_le(header, pos, 4);
469     
470      if (tag->speed_zone_offset[head][i] >= 4)
471      {
472         tag->speed_zone_offset[head][i] += start_pos;
473      }
474
468475      pos += 4;
469476
470      tag->track_size[i] = g64_get_track_size(floppy, 0, i);
477      tag->track_size[head][i] = g64_get_track_size(floppy, head, i);
471478
472      if (tag->track_offset[i] > 0)
479      if (tag->track_offset[head][i] != 0)
473480      {
474         LOG_FORMATS("G64 track %.1f offset %05x length %04x ", get_dos_track(i), tag->track_offset[i], tag->track_size[i]);
481         LOG_FORMATS("G64 side %u track %.1f offset %05x length %04x ", head, get_dos_track(i), tag->track_offset[head][i], tag->track_size[head][i]);
475482
476         if (tag->speed_zone_offset[i] < 4) {
477            LOG_FORMATS("speed %u\n", tag->speed_zone_offset[i]);
483         track_offs = tag->track_offset[head][i];
484
485         if (tag->speed_zone_offset[head][i] < 4) {
486            LOG_FORMATS("speed %u\n", tag->speed_zone_offset[head][i]);
478487         } else {
479            LOG_FORMATS("speed offset %04x\n", tag->speed_zone_offset[i]);
488            LOG_FORMATS("speed offset %04x\n", tag->speed_zone_offset[head][i]);
480489         }
481490      }
482491   }
483492
493   pos = track_offs + 2 + track_size;
494}
495
496FLOPPY_CONSTRUCT( g64_dsk_construct )
497{
498   struct FloppyCallbacks *callbacks;
499   struct g64dsk_tag *tag;
500   UINT64 pos = 0;
501
502   if (params)
503   {
504      // create not supported
505      return FLOPPY_ERROR_UNSUPPORTED;
506   }
507
508   tag = (struct g64dsk_tag *) floppy_create_tag(floppy, sizeof(struct g64dsk_tag));
509
510   if (!tag) return FLOPPY_ERROR_OUTOFMEMORY;
511
512   tag->heads = 0;
513   int head = 0;
514
515   read_g64_header(floppy, tag, head, pos);
516
517   if (floppy_image_size(floppy) > pos)
518   {
519      tag->heads++;
520      head++;
521
522      read_g64_header(floppy, tag, head, pos);
523   }
524
484525   // set callbacks
485526   callbacks = floppy_callbacks(floppy);
486527
trunk/src/lib/formats/g64_dsk.h
r25352r25353
3535// legacy
3636#define G64_SYNC_MARK           0x3ff       /* 10 consecutive 1-bits */
3737
38#define G64_BUFFER_SIZE         16384
38#define G64_BUFFER_SIZE         32768
3939#define G64_SPEED_BLOCK_SIZE    1982
4040
4141const int C2040_BITRATE[] =
trunk/src/mess/machine/c1571.c
r25352r25353
662662//-------------------------------------------------
663663
664664static LEGACY_FLOPPY_OPTIONS_START( c1571 )
665   LEGACY_FLOPPY_OPTION( c1571, "g64", "Commodore 1541 GCR Disk Image", g64_dsk_identify, g64_dsk_construct, NULL, NULL )
665   LEGACY_FLOPPY_OPTION( c1571, "g64,g71", "Commodore 1541/1571 GCR Disk Image", g64_dsk_identify, g64_dsk_construct, NULL, NULL )
666666   LEGACY_FLOPPY_OPTION( c1571, "d64", "Commodore 1541 Disk Image", d64_dsk_identify, d64_dsk_construct, NULL, NULL )
667667   LEGACY_FLOPPY_OPTION( c1571, "d71", "Commodore 1571 Disk Image", d71_dsk_identify, d64_dsk_construct, NULL, NULL )
668668LEGACY_FLOPPY_OPTIONS_END
trunk/src/mess/machine/64h156.c
r25352r25353
754754
755755void c64h156_device::set_side(int side)
756756{
757   m_side = side;
757   if (m_side != side)
758   {
759      m_side = side;
760   
761      // read new track data
762      read_current_track();
763   }
758764}
759765
760766

Previous 199869 Revisions Next


© 1997-2024 The MAME Team