Previous 199869 Revisions Next

r26265 Monday 18th November, 2013 at 16:47:15 UTC by Jürgen Buchmüller
Clean up DIABLO HD code log output and fix comments
[/branches/alto2/src/emu/machine]diablo_hd.c diablo_hd.h

branches/alto2/src/emu/machine/diablo_hd.c
r26264r26265
6363diablo_hd_device::diablo_hd_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
6464   device_t(mconfig, DIABLO_HD, "Diablo Disk", tag, owner, clock, "diablo_hd", __FILE__),
6565#if   DIABLO_DEBUG
66   m_log_level(0),
66   m_log_level(8),
6767#endif
6868   m_diablo31(true),
6969   m_unit(0),
r26264r26265
170170#define   GUARD_ZONE_BITS   (16*32)   //!< end of the guard zone at the beginning of a sector (wild guess!)
171171
172172/**
173 * @brief description of the sector layout
173 * @brief description of the sector layout (reverse engineered)
174174 * <PRE>
175175 *
176176 *                                   xx.x msec sector mark pulses
r26264r26265
280280{
281281   /* If there's no drive, just reset the page number */
282282   if (!m_image) {
283      LOG_DRIVE((0,"[DHD%u]   C/H/S:%d/%d/%d => no image\n", m_unit, m_cylinder, m_head, m_sector));
283      LOG_DRIVE((0,"[DHD%u]   CHS:%03d/%d/%02d => no image\n", m_unit, m_cylinder, m_head, m_sector));
284284      m_page = -1;
285285      return;
286286   }
287287   if (m_cylinder < 0 || m_cylinder >= DIABLO_CYLINDERS) {
288      LOG_DRIVE((0,"[DHD%u]   C/H/S:%d/%d/%d => invalid cylinder\n", m_unit, m_cylinder, m_head, m_sector));
288      LOG_DRIVE((0,"[DHD%u]   CHS:%03d/%d/%02d => invalid cylinder\n", m_unit, m_cylinder, m_head, m_sector));
289289      m_page = -1;
290290      return;
291291   }
292292   if (m_head < 0 || m_head >= DIABLO_HEADS) {
293      LOG_DRIVE((0,"[DHD%u]   C/H/S:%d/%d/%d => invalid head\n", m_unit, m_cylinder, m_head, m_sector));
293      LOG_DRIVE((0,"[DHD%u]   CHS:%03d/%d/%02d => invalid head\n", m_unit, m_cylinder, m_head, m_sector));
294294      m_page = -1;
295295      return;
296296   }
297297   if (m_sector < 0 || m_sector >= DIABLO_SPT) {
298      LOG_DRIVE((0,"[DHD%u]   C/H/S:%d/%d/%d => invalid sector\n", m_unit, m_cylinder, m_head, m_sector));
298      LOG_DRIVE((0,"[DHD%u]   CHS:%03d/%d/%02d => invalid sector\n", m_unit, m_cylinder, m_head, m_sector));
299299      m_page = -1;
300300      return;
301301   }
302302   /* calculate the new disk relative sector offset */
303   m_page = DRIVE_PAGE(m_cylinder, m_head, m_sector);
303   m_page = DIABLO_PAGE(m_cylinder, m_head, m_sector);
304304
305305   // already have the sector image?
306306   if (m_cache[m_page]) {
307      LOG_DRIVE((6,"[DHD%u]   C/H/S:%d/%d/%d => page:%d is cached\n", m_unit, m_cylinder, m_head, m_sector, m_page));
307      LOG_DRIVE((6,"[DHD%u]   CHS:%03d/%d/%02d => page:%d is cached\n", m_unit, m_cylinder, m_head, m_sector, m_page));
308308      return;
309309   }
310310
r26264r26265
313313      m_cache[m_page] = auto_alloc_array(machine(), UINT8, sizeof(diablo_sector_t));
314314      /* and read the page from the hard_disk image */
315315      if (hard_disk_read(m_disk, m_page, m_cache[m_page])) {
316         LOG_DRIVE((2,"[DHD%u]   C/H/S:%d/%d/%d => page:%d loaded\n", m_unit, m_cylinder, m_head, m_sector, m_page));
316         LOG_DRIVE((2,"[DHD%u]   CHS:%03d/%d/%02d => page:%d loaded\n", m_unit, m_cylinder, m_head, m_sector, m_page));
317317      } else {
318         LOG_DRIVE((0,"[DHD%u]   C/H/S:%d/%d/%d => page:%d read failed\n", m_unit, m_cylinder, m_head, m_sector, m_page));
318         LOG_DRIVE((0,"[DHD%u]   CHS:%03d/%d/%02d => page:%d read failed\n", m_unit, m_cylinder, m_head, m_sector, m_page));
319319         auto_free(machine(), m_cache[m_page]);
320320         m_cache[m_page] = 0;
321321      }
r26264r26265
446446   UINT32 *bits = reinterpret_cast<UINT32 *>(auto_alloc_array(machine(), UINT32, 400));
447447
448448   if (m_diablo31) {
449      /* write sync bit after 31 words - 1 bit */
450      dst = expand_sync(bits, 0, 31);
449      /* write sync bit after (MFROBL-MRPAL) words - 1 bit */
450      dst = expand_sync(bits, 0, (MFROBL - MRPAL));
451451      dst = expand_record(bits, dst, s->header, sizeof(s->header));
452452      dst = expand_cksum(bits, dst, s->header, sizeof(s->header));
453453
454      /* write sync bit after 2 * 5 + 1 words - 1 bit */
454      /* write sync bit after 2 * MWPAL + 1 words - 1 bit */
455455      dst = expand_sync(bits, dst, 2 * MWPAL);
456456      dst = expand_record(bits, dst, s->label, sizeof(s->label));
457457      dst = expand_cksum(bits, dst, s->label, sizeof(s->label));
458458
459      /* write sync bit after 2 * 5 + 1 words - 1 bit */
459      /* write sync bit after 2 * MWPAL + 1 words - 1 bit */
460460      dst = expand_sync(bits, dst, 2 * MWPAL);
461461      dst = expand_record(bits, dst, s->data, sizeof(s->data));
462462      dst = expand_cksum(bits, dst, s->data, sizeof(s->data));
r26264r26265
464464      /* fill MWPAL words of clock and 0 data bits */
465465      dst = expand_zeroes(bits, dst, MWPAL);
466466   } else {
467      /* write sync bit after 31 words - 1 bit */
468      dst = expand_sync(bits, 0, 31);
467      /* write sync bit after (MFROBL - MRPAL) words - 1 bit */
468      dst = expand_sync(bits, 0, (MFROBL - MRPAL));
469469      dst = expand_record(bits, dst, s->header, sizeof(s->header));
470470      dst = expand_cksum(bits, dst, s->header, sizeof(s->header));
471471
472      /* write sync bit after 2 * 5 words - 1 bit */
472      /* write sync bit after 2 * MWPAL words - 1 bit */
473473      dst = expand_sync(bits, dst, 2 * MWPAL);
474474      dst = expand_record(bits, dst, s->label, sizeof(s->label));
475475      dst = expand_cksum(bits, dst, s->label, sizeof(s->label));
476476
477      /* write sync bit after 2 * 5 words - 1 bit */
477      /* write sync bit after 2 * MWPAL words - 1 bit */
478478      dst = expand_sync(bits, dst, 2 * MWPAL);
479479      dst = expand_record(bits, dst, s->data, sizeof(s->data));
480480      dst = expand_cksum(bits, dst, s->data, sizeof(s->data));
r26264r26265
484484   }
485485   m_bits[m_page] = bits;
486486
487   LOG_DRIVE((0,"[DHD%u]   C/H/S:%03d/%d/%02d #%5d bits\n", m_unit, m_cylinder, m_head, m_sector, dst));
487   LOG_DRIVE((0,"[DHD%u]   CHS:%03d/%d/%02d #%5d bits\n", m_unit, m_cylinder, m_head, m_sector, dst));
488488#if   DIABLO_DEBUG
489489   dump_record(s->pageno, 0, sizeof(s->pageno), "pageno", 0);
490490   dump_record(s->header, 0, sizeof(s->header), "header", 0);
r26264r26265
680680   int cksum_header, cksum_label, cksum_data;
681681
682682   if (m_rdfirst >= 0) {
683      LOG_DRIVE((0, "[DHD%u]   RD CHS:%03d/%d/%02d bit#%-5d ... bit#%-5d\n",
683      LOG_DRIVE((0, "[DHD%u]   READ CHS:%03d/%d/%02d bit#%d ... bit#%d\n",
684684               m_unit, m_cylinder, m_head, m_sector, m_rdfirst, m_rdlast));
685685   }
686686   m_rdfirst = -1;
r26264r26265
701701   }
702702
703703   if (m_wrfirst >= 0) {
704      LOG_DRIVE((0, "[DHD%u]   WR C/H/S:%03d/%d/%02d bit#%-5d ... bit#%-5d\n",
704      LOG_DRIVE((0, "[DHD%u]   WRITE CHS:%03d/%d/%02d bit#%d ... bit#%d\n",
705705               m_unit, m_cylinder, m_head, m_sector, m_wrfirst, m_wrlast));
706706   }
707707   m_wrfirst = -1;
708708   m_wrlast = -1;
709709
710   if (m_page < 0 || m_page >= DIABLO_PAGES) {
710   if (m_page < 0 || m_page >= m_pages) {
711711      LOG_DRIVE((0,"[DHD%u]   page not set\n", m_unit));
712712      return;
713713   }
r26264r26265
724724   }
725725   UINT32 *bits = m_bits[m_page];
726726
727   /* pointer to sector buffer */
727   // pointer to sector buffer
728728   s = reinterpret_cast<diablo_sector_t *>(m_cache[m_page]);
729729
730   /* zap the sector first */
730   // zap the sector first
731731   memset(s, 0, sizeof(*s));
732732
733733   src = MFRRDL * 32;
734   /* skip first words and garbage until 0 bits are coming in */
735   src = squeeze_unsync(bits, src, 40);
736   /* sync on header preamble */
737   src = squeeze_sync(bits, src, 40);
734   src = squeeze_unsync(bits, src, 40);      // skip first words and garbage until 0 bits are coming in
735   src = squeeze_sync(bits, src, 40);         // sync on header preamble
738736   LOG_DRIVE((0,"[DHD%u]   header sync bit #%5d\n", m_unit, src));
739737   src = squeeze_record(bits, src, s->header, sizeof(s->header));
740738   src = squeeze_cksum(bits, src, &cksum_header);
r26264r26265
742740   dump_record(s->header, 0, sizeof(s->header), "header", 0);
743741#endif
744742
745   /* skip garbage until 0 bits are coming in */
746   src = squeeze_unsync(bits, src, 40);
747   /* sync on label preamble */
748   src = squeeze_sync(bits, src, 40);
743   src = squeeze_unsync(bits, src, 40);      // skip garbage until 0 bits are coming in
744   src = squeeze_sync(bits, src, 40);         // sync on label preamble
749745   LOG_DRIVE((0,"[DHD%u]   label sync bit #%5d\n", m_unit, src));
750746   src = squeeze_record(bits, src, s->label, sizeof(s->label));
751747   src = squeeze_cksum(bits, src, &cksum_label);
r26264r26265
753749   dump_record(s->label, 0, sizeof(s->label), "label", 0);
754750#endif
755751
756   /* skip garbage until 0 bits are coming in */
757   src = squeeze_unsync(bits, src, 40);
758   /* sync on data preamble */
759   src = squeeze_sync(bits, src, 40);
752   src = squeeze_unsync(bits, src, 40);      // skip garbage until 0 bits are coming in
753   src = squeeze_sync(bits, src, 40);         // sync on data preamble
760754   LOG_DRIVE((0,"[DHD%u]   data sync bit #%5d\n", m_unit, src));
761755   src = squeeze_record(bits, src, s->data, sizeof(s->data));
762756   src = squeeze_cksum(bits, src, &cksum_data);
r26264r26265
764758   dump_record(s->data, 0, sizeof(s->data), "data", 1);
765759#endif
766760
767   /* TODO: what is the cksum start value for the data record? */
761   /* The checksum start value always seems to be 0521 */
768762   cksum_header ^= cksum(s->header, sizeof(s->header), 0521);
769763   cksum_label ^= cksum(s->label, sizeof(s->label), 0521);
770764   cksum_data ^= cksum(s->data, sizeof(s->data), 0521);
r26264r26265
11221116   if (-1 == m_wrfirst)
11231117      m_wrfirst = index;
11241118
1125   LOG_DRIVE((7,"[DHD%u]   C/H/S:%d/%d/%d index #%d bit:%d\n", m_unit, m_cylinder, m_head, m_sector, index, wrdata));
1119   LOG_DRIVE((9,"[DHD%u]   CHS:%03d/%d/%02d index #%d bit:%d\n", m_unit, m_cylinder, m_head, m_sector, index, wrdata));
11261120
11271121   if (index < GUARD_ZONE_BITS) {
11281122      /* don't write in the guard zone (?) */
r26264r26265
11701164      m_rdfirst = index;
11711165
11721166   RDBIT(bits,index,bit);
1173   LOG_DRIVE((7,"[DHD%u]   C/H/S:%d/%d/%d index #%d bit:%d\n", m_unit, m_cylinder, m_head, m_sector, index, bit));
1167   LOG_DRIVE((9,"[DHD%u]   CHS:%03d/%d/%02d index #%d bit:%d\n", m_unit, m_cylinder, m_head, m_sector, index, bit));
11741168   m_rdlast = index;
11751169   return bit;
11761170}
r26264r26265
12151209   } else {
12161210      clk = 0;
12171211   }
1218   LOG_DRIVE((7,"[DHD%u]   C/H/S:%d/%d/%d index #%d clk:%d\n", m_unit, m_cylinder, m_head, m_sector, index, clk));
1212   LOG_DRIVE((9,"[DHD%u]   CHS:%03d/%d/%02d index #%d clk:%d\n", m_unit, m_cylinder, m_head, m_sector, index, clk));
12191213   m_rdlast = index;
12201214   return clk ^ 1;
12211215}
r26264r26265
12261220 */
12271221void diablo_hd_device::sector_mark_1()
12281222{
1229   LOG_DRIVE((9,"[DHD%u]   C/H/S:%d/%d/%d sector_mark_0=1\n", m_unit, m_cylinder, m_head, m_sector));
1223   LOG_DRIVE((9,"[DHD%u]   CHS:%03d/%d/%02d sector_mark_0=1\n", m_unit, m_cylinder, m_head, m_sector));
12301224   m_sector_mark_0 = 1;   // deassert sector mark (set to 1)
12311225}
12321226
r26264r26265
12401234 */
12411235void diablo_hd_device::sector_mark_0()
12421236{
1243   LOG_DRIVE((9,"[DHD%u]   C/H/S:%d/%d/%d sector_mark_0=0\n", m_unit, m_cylinder, m_head, m_sector));
1237   LOG_DRIVE((9,"[DHD%u]   CHS:%03d/%d/%02d sector_mark_0=0\n", m_unit, m_cylinder, m_head, m_sector));
12441238
12451239   squeeze_sector();      // squeeze previous sector bits, if it was written to
12461240   m_sector_mark_0 = 0;   // assert sector mark (set to 0)
r26264r26265
12621256   m_packs = 1;      // FIXME: get from configuration?
12631257   m_unit = strstr(m_image->tag(), "diablo0") ? 0 : 1;
12641258
1265   m_cache = auto_alloc_array(machine(), UINT8*, DIABLO_PAGES);
1266   memset(m_cache, 0, sizeof(UINT8*) * DIABLO_PAGES);
1267   m_bits = auto_alloc_array(machine(), UINT32*, DIABLO_PAGES);
1268   memset(m_bits, 0, sizeof(UINT32*) * DIABLO_PAGES);
1259   m_cache = auto_alloc_array(machine(), UINT8*, m_pages);
1260   memset(m_cache, 0, sizeof(UINT8*) * m_pages);
1261   m_bits = auto_alloc_array(machine(), UINT32*, m_pages);
1262   memset(m_bits, 0, sizeof(UINT32*) * m_pages);
12691263
12701264   m_timer = timer_alloc(1, 0);
12711265}
branches/alto2/src/emu/machine/diablo_hd.h
r26264r26265
1313#include "imagedev/diablo.h"
1414
1515#ifndef   DIABLO_DEBUG
16#define   DIABLO_DEBUG   0      //!< set to 1 to enable debug log output
16#define   DIABLO_DEBUG   1      //!< set to 1 to enable debug log output
1717#endif
1818
1919#define DIABLO_HD_0 "diablo0"
r26264r26265
3131   static const int DIABLO_CYLINDERS = 203;      //!< number of cylinders per drive
3232   static const int DIABLO_CYLINDER_MASK = 0777;   //!< bit maks for cylinder number (9 bits)
3333   static const int DIABLO_SPT = 12;            //!< number of sectors per track
34   static const int DIABLO_SECTOR_MASK = 017;      //!< bit maks for cylinder number (4 bits)
34   static const int DIABLO_SECTOR_MASK = 017;      //!< bit maks for sector number (4 bits)
3535   static const int DIABLO_HEADS = 2;            //!< number of heads per drive
36   static const int DIABLO_HEAD_MASK = 1;         //!< bit maks for cylinder number (4 bits)
36   static const int DIABLO_HEAD_MASK = 1;         //!< bit maks for head number (1 bit)
3737   static const int DIABLO_PAGES = 203*2*12;      //!< number of pages per drive
3838   //! convert a cylinder/head/sector to a logical block address (page)
39   static inline int DRIVE_PAGE(int c,int h,int s)   { return (c * DIABLO_HEADS + h) * DIABLO_SPT + s; }
39   static inline int DIABLO_PAGE(int c, int h, int s) { return (c * DIABLO_HEADS + h) * DIABLO_SPT + s; }
4040
4141   void set_sector_callback(void* cookie, void(*callback)(void*, int));
4242
r26264r26265
102102   int m_cylinder;                     //!< current cylinder number
103103   int m_head;                        //!< current head (track) number on cylinder
104104   int m_sector;                     //!< current sector number in track
105   int m_page;                        //!< current page
105   int m_page;                        //!< current page (derived from cylinder, head and sector)
106106   int m_pages;                     //!< total number of pages
107107   UINT8** m_cache;                  //!< pages raw bytes
108108   UINT32** m_bits;                  //!< pages expanded to bits

Previous 199869 Revisions Next


© 1997-2024 The MAME Team