Previous 199869 Revisions Next

r26135 Wednesday 13th November, 2013 at 14:02:09 UTC by Jürgen Buchmüller
Trying to resolve the diablo_hd_device links down to the chd_file and the hard_disk_file. Renamed some variables.
[/branches/alto2/src/emu/imagedev]diablo.c
[/branches/alto2/src/emu/machine]diablo_hd.c diablo_hd.h

branches/alto2/src/emu/machine/diablo_hd.c
r26134r26135
6565#if   DIABLO_DEBUG
6666   m_log_level(9),
6767#endif
68   m_chd(*this, tag),
6968   m_diablo31(true),
7069   m_unit(0),
7170   m_description(),
r26134r26135
8988   m_sector(-1),
9089   m_page(-1),
9190   m_pages(DIABLO_PAGES),
92   m_image(0),
91   m_cache(0),
9392   m_bits(0),
9493   m_rdfirst(-1),
9594   m_rdlast(-1),
r26134r26135
9796   m_wrlast(-1),
9897   m_sector_callback(0),
9998   m_sector_timer(0),
100   m_drive(0)
99   m_image(0),
100   m_handle(0),
101   m_disk(0)
101102{
102103}
103104
104105diablo_hd_device::~diablo_hd_device()
105106{
106107   for (int page = 0; page < m_pages; page++) {
107      if (m_image && m_image[page])
108         global_free(m_image[page]);
108      if (m_cache && m_cache[page])
109         global_free(m_cache[page]);
109110      if (m_bits && m_bits[page])
110111         global_free(m_bits[page]);
111112   }
112   if (m_image) {
113      global_free(m_image);
114      m_image = 0;
113   if (m_cache) {
114      global_free(m_cache);
115      m_cache = 0;
115116   }
116117   if (m_bits) {
117118      global_free(m_bits);
r26134r26135
120121}
121122
122123#if   DIABLO_DEBUG
123void alto2_cpu_device::logprintf(int level, const char* format, ...)
124void diablo_hd_device::logprintf(int level, const char* format, ...)
124125{
125126   if (level > m_log_level)
126127      return;
r26134r26135
265266void diablo_hd_device::read_sector()
266267{
267268   /* If there's no drive, just reset the page number */
268   if (!m_drive) {
269   if (!m_image) {
269270      m_page = -1;
270271      return;
271272   }
r26134r26135
289290   LOG_DRIVE((9,"   DRIVE C/H/S:%d/%d/%d => page:%d\n", m_cylinder, m_head, m_sector, m_page));
290291
291292   // already have the sector image?
292   if (m_image[m_page])
293   if (m_cache[m_page])
293294      return;
294295
295   hard_disk_file *file = m_drive->get_hard_disk_file();
296   if (!file) {
297      LOG_DRIVE((0,"   no file for unit #%d\n", m_unit));
298      return;
299   }
300
301296   /* allocate a buffer for this page */
302   m_image[m_page] = global_alloc_array(UINT8, sizeof(diablo_sector_t));
297   m_cache[m_page] = global_alloc_array(UINT8, sizeof(diablo_sector_t));
303298   /* and read the page from the hard_disk image */
304   if (!hard_disk_read(file, m_page, m_image[m_page])) {
299   if (!hard_disk_read(m_disk, m_page, m_cache[m_page])) {
305300      LOG_DRIVE((0,"   read failed for #%d page #%d\n", m_unit, m_page));
306      global_free(m_image[m_page]);
307      m_image[m_page] = 0;
301      global_free(m_cache[m_page]);
302      m_cache[m_page] = 0;
308303      return;
309304   }
310305}
r26134r26135
420415      return m_bits[m_page];
421416
422417   /* allocate a sector buffer */
423   if (!m_image[m_page]) {
418   if (!m_cache[m_page]) {
424419      LOG_DRIVE((0,"   no image for #%d page #%d\n", m_unit, m_page));
425420      return NULL;
426421   }
427   diablo_sector_t *s = reinterpret_cast<diablo_sector_t *>(m_image[m_page]);
422   diablo_sector_t *s = reinterpret_cast<diablo_sector_t *>(m_cache[m_page]);
428423
429424   /* allocate a bits image */
430425   UINT32 *bits = reinterpret_cast<UINT32 *>(global_alloc_array(UINT32, 400));
r26134r26135
476471}
477472
478473#if   DIABLO_DEBUG
479void diablo_hd_device::drive_dump_ascii(UINT8 *src, size_t size)
474void diablo_hd_device::dump_ascii(UINT8 *src, size_t size)
480475{
481476   size_t offs;
482477   LOG_DRIVE((0," ["));
r26134r26135
505500         LOG_DRIVE((0," %06o", word));
506501      } else {
507502         if (offs > 0)
508            drive_dump_ascii(&src[offs-16], 16);
503            dump_ascii(&src[offs-16], 16);
509504         LOG_DRIVE((0,"\t%05o: %06o", (addr + offs) / 2, word));
510505      }
511506   }
512507   if (offs % 16) {
513      drive_dump_ascii(&src[offs - (offs % 16)], offs % 16);
508      dump_ascii(&src[offs - (offs % 16)], offs % 16);
514509   } else {
515      drive_dump_ascii(&src[offs-16], 16);
510      dump_ascii(&src[offs-16], 16);
516511   }
517512   if (cr) {
518513      LOG_DRIVE((0,"\n"));
r26134r26135
695690      return;
696691   }
697692
698   if (!m_image[m_page]) {
693   if (!m_cache[m_page]) {
699694      LOG_DRIVE((0,"   no image for #%d: %d/%d/%d\n", m_unit, m_cylinder, m_head, m_sector));
700695      return;
701696   }
r26134r26135
708703   UINT32 *bits = m_bits[m_page];
709704
710705   /* pointer to sector buffer */
711   s = reinterpret_cast<diablo_sector_t *>(m_image[m_page]);
706   s = reinterpret_cast<diablo_sector_t *>(m_cache[m_page]);
712707
713708   /* zap the sector first */
714709   memset(s, 0, sizeof(*s));
r26134r26135
762757   global_free(m_bits[m_page]);
763758   m_bits[m_page] = 0;
764759
765   hard_disk_file *file = m_drive->get_hard_disk_file();
766   if (!file) {
767      LOG_DRIVE((0,"   no file for unit #%d\n", m_unit));
768      return;
769   }
770
771   if (!hard_disk_write(file, m_page, m_image[m_page])) {
760   if (!hard_disk_write(m_disk, m_page, m_cache[m_page])) {
772761      LOG_DRIVE((0,"   write failed for #%d page #%d\n", m_unit, m_page));
773762   }
774763}
r26134r26135
956945      printf("select unit:%d head:%d\n", unit, head);
957946   }
958947
959   if (m_drive) {
948   if (m_image) {
960949      /* it is ready */
961950      m_ready_0 = 0;
962951      /* and can take seek/read/write commands */
r26134r26135
11041093   if (-1 == m_wrfirst)
11051094      m_wrfirst = index;
11061095
1107   LOG_DRIVE((7,"   write #%d %d/%d/%d bit #%d bit:%d\n", unit, m_cylinder, m_head, m_sector, index, wrdata));
1096   LOG_DRIVE((7,"   write #%d %d/%d/%d bit #%d bit:%d\n", m_unit, m_cylinder, m_head, m_sector, index, wrdata));
11081097
11091098   if (index < GUARD_ZONE_BITS) {
11101099      /* don't write in the guard zone (?) */
r26134r26135
11511140      m_rdfirst = index;
11521141
11531142   RDBIT(bits,index,bit);
1154   LOG_DRIVE((7,"   read #%d %d/%d/%d bit #%d:%d\n", unit, m_cylinder, m_head, m_sector, index, bit));
1143   LOG_DRIVE((7,"   read #%d %d/%d/%d bit #%d:%d\n", m_unit, m_cylinder, m_head, m_sector, index, bit));
11551144   m_rdlast = index;
11561145   return bit;
11571146}
r26134r26135
11931182   } else {
11941183      RDBIT(bits,index,clk);
11951184   }
1196   LOG_DRIVE((7,   "   read #%d %d/%d/%d clk #%d:%d\n", unit, m_cylinder, m_head, m_sector, index, clk));
1185   LOG_DRIVE((7,   "   read #%d %d/%d/%d clk #%d:%d\n", m_unit, m_cylinder, m_head, m_sector, index, clk));
11971186   m_rdlast = index;
11981187   return clk ^ 1;
11991188}
r26134r26135
12721261
12731262void diablo_hd_device::device_start()
12741263{
1264   m_image = static_cast<diablo_image_device *>(subdevice("drive"));
1265   LOG_DRIVE((0,"   m_image=%p\n", m_image));
1266
1267   m_diablo31 = true;   // FIXME: get from m_handle meta data?
1268   m_packs = 1;      // FIXME: get from configuration?
1269
12751270   if (m_diablo31) {
12761271      snprintf(m_description, sizeof(m_description), "DIABLO31");
12771272      m_rotation_time = DIABLO31_ROTATION_TIME;
r26134r26135
12871282      m_sector_mark_1_time = DIABLO44_SECTOR_MARK_PULSE_PRE;
12881283      m_bit_time = DIABLO44_BIT_TIME(1);
12891284   }
1285
1286   m_cache = global_alloc_array(UINT8*, DIABLO_PAGES);
1287   m_bits = global_alloc_array(UINT32*, DIABLO_PAGES);
1288
12901289   m_sector_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(diablo_hd_device::next_sector),this));
12911290   m_sector_timer->adjust(m_sector_time - m_sector_mark_0_time, 0);
12921291}
12931292
12941293void diablo_hd_device::device_reset()
12951294{
1295   m_handle = m_image->get_chd_file();
1296   m_disk = m_image->get_hard_disk_file();
1297   LOG_DRIVE((0,"   m_handle=%p m_disk=%p\n", m_image, m_handle, m_disk));
1298
12961299   m_s_r_w_0 = 1;               /* seek/read/write not ready */
12971300   m_ready_0 = 1;               /* drive is not ready */
12981301   m_sector_mark_0 = 1;         /* sector mark clear */
r26134r26135
13161319   m_wrlast = -1;
13171320   m_rdfirst = -1;
13181321   m_rdlast = -1;
1319
1320   m_drive = static_cast<diablo_image_device *>(subdevice("drive"));
13211322}
13221323
13231324MACHINE_CONFIG_FRAGMENT( diablo_drive )
branches/alto2/src/emu/machine/diablo_hd.h
r26134r26135
1212#include "emu.h"
1313#include "imagedev/diablo.h"
1414
15#define   DIABLO_DEBUG   0
15#define   DIABLO_DEBUG   1
1616
17#if   DIABLO_DEBUG
18#include "debug/debugcon.h"
19#endif
20
1721#define DIABLO_HD_0 "diablo0"
1822#define DIABLO_HD_1 "diablo1"
1923
r26134r26135
6165   int m_log_level;
6266   void logprintf(int level, const char* format, ...);
6367#   define   LOG_DRIVE(x) logprintf x
68
69   void dump_ascii(UINT8 *src, size_t size);
70   size_t dump_record(UINT8 *src, size_t addr, size_t size, const char *name, int cr);
6471#else
6572#   define   LOG_DRIVE(x)
6673#endif
6774
68   required_device<diablo_image_device> m_chd;      //!< image device
69
7075   static const int DIABLO_UNIT_MAX = 2;         //!< max number of drive units
7176   static const int DIABLO_CYLINDERS = 203;      //!< number of cylinders per drive
7277   static const int DIABLO_CYLINDER_MASK = 0777;   //!< bit maks for cylinder number (9 bits)
r26134r26135
101106   int m_sector;               //!< current sector number in track
102107   int m_page;                  //!< current page
103108   int m_pages;               //!< total number of pages
104   UINT8** m_image;            //!< pages raw bytes
109   UINT8** m_cache;            //!< pages raw bytes
105110   UINT32** m_bits;            //!< pages expanded to bits
106111   int m_rdfirst;               //!< set to first bit of a sector that is read from
107112   int m_rdlast;               //!< set to last bit of a sector that was read from
r26134r26135
109114   int m_wrlast;               //!< set to last bit of a sector that was written to
110115   void (*m_sector_callback)();   //!< callback to call at the start of each sector
111116   emu_timer* m_sector_timer;      //!< sector timer
112   diablo_image_device *m_drive;
117   diablo_image_device* m_image;   //!< diablo_image_device interfacing the CHD
118   chd_file* m_handle;            //!< underlying CHD handle
119   hard_disk_file* m_disk;         //!< underlying hard disk file
113120
114121   void read_sector();            //!< translate C/H/S to a page and read the sector
115122   int cksum(UINT8 *src, size_t size, int start);
branches/alto2/src/emu/imagedev/diablo.c
r26134r26135
2121OPTION_GUIDE_END
2222
2323static const char *dsk_option_spec =
24   "t[31]/44;C1-[203]-1024;H1/[2]/4/8;S1-[12]-64;L267;K6408";
24   "C1-[203]-1024;H1/[2]/4/8;S1-[12]-64;L267;K6408";
2525
2626
2727// device type definition

Previous 199869 Revisions Next


© 1997-2024 The MAME Team