Previous 199869 Revisions Next

r29181 Wednesday 2nd April, 2014 at 12:22:26 UTC by Miodrag Milanović
Getting rid of token usage in devices (nw)
[src/emu/bus/isa]omti8621.c omti8621.h
[src/emu/bus/nubus]nubus_image.c nubus_image.h

trunk/src/emu/bus/isa/omti8621.c
r29180r29181
2828#define LOG2(x) { if (verbose > 1) LOG(x)}
2929#define LOG3(x) { if (verbose > 2) LOG(x)}
3030
31#define DLOG(x) { logerror ("%s: ", cpu_context(disk->device)); logerror x; logerror ("\n"); }
32#define DLOG1(x)    { if (verbose > 0) DLOG(x)}
33#define DLOG2(x)    { if (verbose > 1) DLOG(x)}                       
34
3531#define OMTI_DISK_SECTOR_SIZE 1056
3632
3733#define OMTI_DISK_TYPE_155_MB 0x607 // Micropolis 1355 (170 MB Dtype = 607)
r29180r29181
5147// forward declaration of image class
5248extern const device_type OMTI_DISK;
5349
54class omti_disk_image_device :  public device_t,
55                        public device_image_interface
56{
57public:
58   // construction/destruction
59   omti_disk_image_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
60
61   // image-level overrides
62   virtual iodevice_t image_type() const { return IO_HARDDISK; }
63
64   virtual bool is_readable()  const { return 1; }
65   virtual bool is_writeable() const { return 1; }
66   virtual bool is_creatable() const { return 1; }
67   virtual bool must_be_loaded() const { return 0; }
68   virtual bool is_reset_on_load() const { return 0; }
69   virtual const char *image_interface() const { return NULL; }
70   virtual const char *file_extensions() const { return "awd"; }
71   virtual const option_guide *create_option_guide() const { return NULL; }
72
73   virtual bool call_create(int format_type, option_resolution *format_options);
74
75   disk_data *token() { return &m_token; }
76protected:
77   // device-level overrides
78   virtual void device_config_complete();
79   virtual void device_start();
80   virtual void device_reset();
81
82   disk_data m_token;
83};
84
8550/*
8651 * I/O register offsets
8752 */
r29180r29181
279244   sector_buffer.resize(OMTI_DISK_SECTOR_SIZE*OMTI_MAX_BLOCK_COUNT);
280245
281246   m_timer = timer_alloc(0, NULL);
282
283   device_t *device0 = subdevice(OMTI_DISK0_TAG);
284   our_disks[0] = (disk_data *) downcast<omti_disk_image_device *>(device0)->token();
285
286   device_t *device1 = subdevice(OMTI_DISK1_TAG);
287   our_disks[1] = (disk_data *) downcast<omti_disk_image_device *>(device1)->token();
247   
248   our_disks[0] = subdevice<omti_disk_image_device>(OMTI_DISK0_TAG);
249   our_disks[1] = subdevice<omti_disk_image_device>(OMTI_DISK1_TAG);
288250}
289251
290252/*-------------------------------------------------
r29180r29181
320282      m_installed = true;
321283   }
322284
323   set_jumper(our_disks[0]->type);
285   set_jumper(our_disks[0]->m_type);
324286
325287   // should go from reset to idle after 100 us
326288   // state->omti_state = OMTI_STATE_RESET;
r29180r29181
422384   LOG2(("set_configuration_data lun=%x", lun));
423385
424386   // initialize the configuration data
425   disk_data *disk = our_disks[lun];
387   omti_disk_image_device *disk = our_disks[lun];
426388
427   disk->config_data[0] = (disk->cylinders - 1) >> 8; // Number of Cylinders (MSB)
428   disk->config_data[1] = (disk->cylinders - 1) & 0xff; // Number of Cylinders (LSB) (-1)
429   disk->config_data[2] = disk->heads - 1; // Number of Heads (-1)
430   disk->config_data[3] = disk->sectors - 1; // Number of Sectors (-1)
431   disk->config_data[4] = 0x02; // Drive Configuration Word (MSB)
432   disk->config_data[5] = 0x44; // Drive Configuration Word (LSB)
433   disk->config_data[6] = 0x00; // ISG AFTER INDEX
434   disk->config_data[7] = 0x00; // PLO SYN Field (ID)
435   disk->config_data[8] = 0x00; // PLO SYN Field (DATA)
436   disk->config_data[9] = 0x00; // ISG AFTER SECTOR
389   disk->m_config_data[0] = (disk->m_cylinders - 1) >> 8; // Number of Cylinders (MSB)
390   disk->m_config_data[1] = (disk->m_cylinders - 1) & 0xff; // Number of Cylinders (LSB) (-1)
391   disk->m_config_data[2] = disk->m_heads - 1; // Number of Heads (-1)
392   disk->m_config_data[3] = disk->m_sectors - 1; // Number of Sectors (-1)
393   disk->m_config_data[4] = 0x02; // Drive Configuration Word (MSB)
394   disk->m_config_data[5] = 0x44; // Drive Configuration Word (LSB)
395   disk->m_config_data[6] = 0x00; // ISG AFTER INDEX
396   disk->m_config_data[7] = 0x00; // PLO SYN Field (ID)
397   disk->m_config_data[8] = 0x00; // PLO SYN Field (DATA)
398   disk->m_config_data[9] = 0x00; // ISG AFTER SECTOR
437399}
438400
439401/***************************************************************************
r29180r29181
457419   UINT16 sector = cdb[2] & 0x3f;
458420   UINT32 cylinder = cdb[3] + ((cdb[2] & 0xc0) << 2) + ((cdb[1] & 0x80) << 3);
459421   UINT8 block_count = cdb[4];
460   disk_data *disk = our_disks[lun];
422   omti_disk_image_device *disk = our_disks[lun];
461423
462   UINT32 disk_track = cylinder * disk->heads + head;
463   UINT32 disk_addr = (disk_track * disk->sectors) + sector;
424   UINT32 disk_track = cylinder * disk->m_heads + head;
425   UINT32 disk_addr = (disk_track * disk->m_sectors) + sector;
464426
465427   if (block_count > OMTI_MAX_BLOCK_COUNT) {
466428      LOG(("########### check_disk_address: unexpected block count %x", block_count));
r29180r29181
469431
470432   if (lun > OMTI_MAX_LUN) {
471433      sense_code = OMTI_SENSE_CODE_DRIVE_NOT_READY;
472   } else  if (!disk->image->exists()) {
434   } else  if (!disk->m_image->exists()) {
473435      sense_code = OMTI_SENSE_CODE_DRIVE_NOT_READY;
474436   } else  if (sector >= OMTI_MAX_BLOCK_COUNT) {
475437      sense_code = OMTI_SENSE_CODE_ILLEGAL_ADDRESS | OMTI_SENSE_CODE_ADDRESS_VALID;
476   } else if (head >= disk->heads) {
438   } else if (head >= disk->m_heads) {
477439      sense_code = OMTI_SENSE_CODE_ILLEGAL_ADDRESS | OMTI_SENSE_CODE_ADDRESS_VALID;
478   } else if (cylinder >= disk->cylinders) {
440   } else if (cylinder >= disk->m_cylinders) {
479441      sense_code = OMTI_SENSE_CODE_ILLEGAL_ADDRESS | OMTI_SENSE_CODE_ADDRESS_VALID;
480442   } else if ( disk_track == diskaddr_format_bad_track && disk_track != 0) {
481443      sense_code = OMTI_SENSE_CODE_BAD_TRACK;
r29180r29181
502464   UINT8 lun = get_lun(cdb);
503465   UINT16 head = cdb[1] & 0x1f;
504466   UINT32 cylinder = cdb[3] + ((cdb[2] & 0xc0) << 2) + ((cdb[1] & 0x80) << 3);
505   return cylinder * our_disks[lun]->heads + head;
467   return cylinder * our_disks[lun]->m_heads + head;
506468}
507469
508470/***************************************************************************
r29180r29181
512474UINT32 omti8621_device::get_disk_address(const UINT8 * cdb) {
513475   UINT8 lun = get_lun(cdb);
514476   UINT16 sector = cdb[2] & 0x3f;
515   return get_disk_track(cdb) * our_disks[lun]->sectors + sector;
477   return get_disk_track(cdb) * our_disks[lun]->m_sectors + sector;
516478}
517479
518480/***************************************************************************
r29180r29181
538500void omti8621_device::read_sectors_from_disk(INT32 diskaddr, UINT8 count, UINT8 lun)
539501{
540502   UINT8 *data_buffer = sector_buffer;
541   device_image_interface *image = our_disks[lun]->image;
503   device_image_interface *image = our_disks[lun]->m_image;
542504
543505   while (count-- > 0) {
544506      LOG2(("read_sectors_from_disk lun=%d diskaddr=%x", lun, diskaddr));
r29180r29181
558520void omti8621_device::write_sectors_to_disk(INT32 diskaddr, UINT8 count, UINT8 lun)
559521{
560522   UINT8 *data_buffer = sector_buffer;
561   device_image_interface *image = our_disks[lun]->image;
523   device_image_interface *image = our_disks[lun]->m_image;
562524
563525   while (count-- > 0) {
564526      LOG2(("write_sectors_to_disk lun=%d diskaddr=%x", lun, diskaddr));
r29180r29181
582544
583545void omti8621_device::copy_sectors(INT32 dst_addr, INT32 src_addr, UINT8 count, UINT8 lun)
584546{
585   device_image_interface *image = our_disks[lun]->image;
547   device_image_interface *image = our_disks[lun]->m_image;
586548
587549   LOG2(("copy_sectors lun=%d src_addr=%x dst_addr=%x count=%x", lun, src_addr, dst_addr, count));
588550
r29180r29181
635597
636598   if (check_disk_address(cdb) ) {
637599      if ((cdb[5] & 0x40) == 0) {
638         memset(sector_buffer, 0x6C, OMTI_DISK_SECTOR_SIZE * our_disks[lun]->sectors);
600         memset(sector_buffer, 0x6C, OMTI_DISK_SECTOR_SIZE * our_disks[lun]->m_sectors);
639601      }
640      write_sectors_to_disk(disk_addr, our_disks[lun]->sectors, lun);
602      write_sectors_to_disk(disk_addr, our_disks[lun]->m_sectors, lun);
641603   }
642604
643605}
r29180r29181
648610
649611void omti8621_device::set_esdi_defect_list(UINT8 lun, UINT8 head)
650612{
651   disk_data *disk = our_disks[lun];
613   omti_disk_image_device *disk = our_disks[lun];
652614
653   memset(disk->esdi_defect_list, 0, sizeof(disk->esdi_defect_list));
654   disk->esdi_defect_list[0] = 1; // month
655   disk->esdi_defect_list[1] = 1; // day
656   disk->esdi_defect_list[2] = 90; // year
657   disk->esdi_defect_list[3] = head;
658   memset(disk->esdi_defect_list+6, 0xff, 5); // end of defect list
615   memset(disk->m_esdi_defect_list, 0, sizeof(disk->m_esdi_defect_list));
616   disk->m_esdi_defect_list[0] = 1; // month
617   disk->m_esdi_defect_list[1] = 1; // day
618   disk->m_esdi_defect_list[2] = 90; // year
619   disk->m_esdi_defect_list[3] = head;
620   memset(disk->m_esdi_defect_list+6, 0xff, 5); // end of defect list
659621}
660622
661623/***************************************************************************
r29180r29181
785747void omti8621_device::do_command(const UINT8 cdb[], const UINT16 cdb_length)
786748{
787749   UINT8 lun = get_lun(cdb);
788   disk_data *disk = our_disks[lun];
750   omti_disk_image_device *disk = our_disks[lun];
789751   int command_duration = 0; // ms
790752
791753   log_command( cdb, cdb_length);
r29180r29181
799761      set_interrupt(CLEAR_LINE);
800762   }
801763
802   if (!disk->image->exists()) {
764   if (!disk->m_image->exists()) {
803765      command_status |= OMTI_COMMAND_STATUS_ERROR; // no such drive
804766   }
805767
806768   switch (cdb[0]) {
807769   case OMTI_CMD_TEST_DRIVE_READY: // 0x00
808      if (!disk->image->exists())
770      if (!disk->m_image->exists())
809771      {
810772         set_sense_data(OMTI_SENSE_CODE_DRIVE_NOT_READY, cdb);
811773      }
r29180r29181
866828
867829   case OMTI_CMD_READ_ESDI_DEFECT_LIST: // 0x37
868830      set_esdi_defect_list(get_lun(cdb), cdb[1] & 0x1f);
869      set_data_transfer(disk->esdi_defect_list, sizeof(disk->esdi_defect_list));
831      set_data_transfer(disk->m_esdi_defect_list, sizeof(disk->m_esdi_defect_list));
870832      break;
871833
872834   case OMTI_CMD_ASSIGN_ALTERNATE_TRACK: // 0x11
r29180r29181
917879
918880   case OMTI_CMD_READ_CONFIGURATION: // 0xEC
919881      set_configuration_data(get_lun(cdb));
920      set_data_transfer(disk->config_data, sizeof(disk->config_data));
882      set_data_transfer(disk->m_config_data, sizeof(disk->m_config_data));
921883      break;
922884
923885   case OMTI_CMD_INVALID_COMMAND: // 0xFF
r29180r29181
11961158
11971159UINT32 omti8621_device::get_sector(INT32 diskaddr, UINT8 *data_buffer, UINT32 length, UINT8 lun)
11981160{
1199   disk_data *disk = our_disks[lun];
1161   omti_disk_image_device *disk = our_disks[lun];
12001162
1201   if (disk->image == NULL || !disk->image->exists())
1163   if (disk->m_image == NULL || !disk->m_image->exists())
12021164   {
12031165      return 0;
12041166   }
r29180r29181
12091171      // restrict length to size of 1 sector (i.e. 1024 Byte)
12101172      length = length < OMTI_DISK_SECTOR_SIZE ? length  : OMTI_DISK_SECTOR_SIZE;
12111173
1212      disk->image->fseek(diskaddr * OMTI_DISK_SECTOR_SIZE, SEEK_SET);
1213      disk->image->fread(data_buffer, length);
1174      disk->m_image->fseek(diskaddr * OMTI_DISK_SECTOR_SIZE, SEEK_SET);
1175      disk->m_image->fread(data_buffer, length);
12141176
12151177      return length;
12161178   }
r29180r29181
12821244
12831245
12841246/***************************************************************************
1285 get_safe_disk_token - makes sure that the passed in device is a OMTI disk
1286 ***************************************************************************/
1287
1288INLINE disk_data *get_safe_disk_token(device_t *device) {
1289   assert(device != NULL);
1290   assert(device->type() == OMTI_DISK);
1291   return (disk_data *) downcast<omti_disk_image_device *>(device)->token();
1292}
1293
1294/***************************************************************************
12951247 omti_disk_config - configure disk parameters
12961248 ***************************************************************************/
12971249
1298static void omti_disk_config(disk_data *disk, UINT16 disk_type)
1250void omti_disk_image_device::omti_disk_config(UINT16 disk_type)
12991251{
1300   DLOG1(("omti_disk_config: configuring disk with type %x", disk_type));
1252   LOG1(("omti_disk_config: configuring disk with type %x", disk_type));
13011253
13021254   switch (disk_type)
13031255   {
13041256   case OMTI_DISK_TYPE_348_MB: // Maxtor 380 MB (348-MB FA formatted)
1305      disk->cylinders = 1223;
1306      disk->heads = 15;
1307      disk->sectors = 18;
1257      m_cylinders = 1223;
1258      m_heads = 15;
1259      m_sectors = 18;
13081260      break;
13091261
13101262   case OMTI_DISK_TYPE_155_MB: // Micropolis 170 MB (155-MB formatted)
13111263   default:
1312      disk->cylinders = 1023;
1313      disk->heads = 8;
1314      disk->sectors = 18;
1264      m_cylinders = 1023;
1265      m_heads = 8;
1266      m_sectors = 18;
13151267      break;
13161268   }
13171269
1318   disk->type = disk_type;
1319   disk->sectorbytes = OMTI_DISK_SECTOR_SIZE;
1320   disk->sector_count = disk->cylinders * disk->heads * disk->sectors;
1270   m_type = disk_type;
1271   m_sectorbytes = OMTI_DISK_SECTOR_SIZE;
1272   m_sector_count = m_cylinders * m_heads * m_sectors;
13211273}
13221274
13231275/*-------------------------------------------------
r29180r29181
13261278
13271279void omti_disk_image_device::device_start()
13281280{
1329   disk_data *disk = get_safe_disk_token(this);
1281   m_image = this;
13301282
1331   disk->device = this;
1332   // note: we must have disk->device before we can log
1333
1334   disk->image = this;
1335
1336   if (disk->image->image_core_file() == NULL)
1283   if (m_image->image_core_file() == NULL)
13371284   {
1338      DLOG1(("device_start_omti_disk: no disk"));
1285      LOG1(("device_start_omti_disk: no disk"));
13391286   }
13401287   else
13411288   {
1342      DLOG1(("device_start_omti_disk: with disk image %s",disk->image->basename() ));
1289      LOG1(("device_start_omti_disk: with disk image %s",m_image->basename() ));
13431290   }
13441291
13451292   // default disk type
1346   omti_disk_config(disk, OMTI_DISK_TYPE_DEFAULT);
1293   omti_disk_config(OMTI_DISK_TYPE_DEFAULT);
13471294}
13481295
13491296/*-------------------------------------------------
r29180r29181
13511298-------------------------------------------------*/
13521299
13531300void omti_disk_image_device::device_reset()
1354{
1355   disk_data *disk = get_safe_disk_token(this);
1356   DLOG1(("device_reset_omti_disk"));
1301{   
1302   LOG1(("device_reset_omti_disk"));
13571303
13581304   if (exists() && fseek(0, SEEK_END) == 0)
13591305   {
13601306      UINT32 disk_size = (UINT32)(ftell() / OMTI_DISK_SECTOR_SIZE);
13611307      UINT16 disk_type = disk_size >= 300000 ? OMTI_DISK_TYPE_348_MB : OMTI_DISK_TYPE_155_MB;
1362      if (disk_type != disk->type) {
1363         DLOG1(("device_reset_omti_disk: disk size=%d blocks, disk type=%x", disk_size, disk_type ));
1364         omti_disk_config(disk, disk_type);
1308      if (disk_type != m_type) {
1309         LOG1(("device_reset_omti_disk: disk size=%d blocks, disk type=%x", disk_size, disk_type ));
1310         omti_disk_config(disk_type);
13651311      }
13661312   }
13671313}
r29180r29181
13721318
13731319bool omti_disk_image_device::call_create(int format_type, option_resolution *format_options)
13741320{
1375   disk_data *disk = get_safe_disk_token(this);
1376   DLOG(("device_create_omti_disk: creating OMTI Disk with %d blocks", disk->sector_count));
1321   LOG(("device_create_omti_disk: creating OMTI Disk with %d blocks", m_sector_count));
13771322
13781323   int x;
13791324   unsigned char sectordata[OMTI_DISK_SECTOR_SIZE]; // empty block data
13801325
13811326
13821327   memset(sectordata, 0x55, sizeof(sectordata));
1383   for (x = 0; x < disk->sector_count; x++)
1328   for (x = 0; x < m_sector_count; x++)
13841329   {
13851330      if (fwrite(sectordata, OMTI_DISK_SECTOR_SIZE)
13861331            < OMTI_DISK_SECTOR_SIZE)
trunk/src/emu/bus/isa/omti8621.h
r29180r29181
2727 FUNCTION PROTOTYPES
2828 ***************************************************************************/
2929
30struct disk_data
30class omti_disk_image_device :  public device_t,
31                        public device_image_interface
3132{
32   device_t *device;
33   UINT16 type;
34   UINT16 cylinders;
35   UINT16 heads;
36   UINT16 sectors;
37   UINT32 sectorbytes;
38   UINT32 sector_count;
33public:
34   // construction/destruction
35   omti_disk_image_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
3936
40   device_image_interface *image;
37   // image-level overrides
38   virtual iodevice_t image_type() const { return IO_HARDDISK; }
4139
40   virtual bool is_readable()  const { return 1; }
41   virtual bool is_writeable() const { return 1; }
42   virtual bool is_creatable() const { return 1; }
43   virtual bool must_be_loaded() const { return 0; }
44   virtual bool is_reset_on_load() const { return 0; }
45   virtual const char *image_interface() const { return NULL; }
46   virtual const char *file_extensions() const { return "awd"; }
47   virtual const option_guide *create_option_guide() const { return NULL; }
48
49   virtual bool call_create(int format_type, option_resolution *format_options);
50protected:
51   // device-level overrides
52   virtual void device_config_complete();
53   virtual void device_start();
54   virtual void device_reset();
55   
56   void omti_disk_config(UINT16 disk_type);
57public:
58   UINT16 m_type;
59   UINT16 m_cylinders;
60   UINT16 m_heads;
61   UINT16 m_sectors;
62   UINT32 m_sectorbytes;
63   UINT32 m_sector_count;
64
65   device_image_interface *m_image;
66
4267   // configuration data
43   UINT8 config_data[10];
68   UINT8 m_config_data[10];
4469
4570   // ESDI defect list data
46   UINT8 esdi_defect_list[256];
71   UINT8 m_esdi_defect_list[256];
4772};
4873
4974/* ----- device interface ----- */
r29180r29181
87112   void set_interrupt(enum line_state line_state);
88113
89114private:
90   disk_data *our_disks[OMTI_MAX_LUN+1];
115   omti_disk_image_device *our_disks[OMTI_MAX_LUN+1];
91116
92117   UINT16 jumper;
93118
trunk/src/emu/bus/nubus/nubus_image.c
r29180r29181
1414
1515#define MESSIMG_DISK_SECTOR_SIZE (512)
1616
17// messimg_disk_image_device
18
19class messimg_disk_image_device :   public device_t,
20                        public device_image_interface
21{
22public:
23   // construction/destruction
24   messimg_disk_image_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
25
26   // image-level overrides
27   virtual iodevice_t image_type() const { return IO_QUICKLOAD; }
28
29   virtual bool is_readable()  const { return 1; }
30   virtual bool is_writeable() const { return 1; }
31   virtual bool is_creatable() const { return 0; }
32   virtual bool must_be_loaded() const { return 0; }
33   virtual bool is_reset_on_load() const { return 0; }
34   virtual const char *image_interface() const { return NULL; }
35   virtual const char *file_extensions() const { return "img"; }
36   virtual const option_guide *create_option_guide() const { return NULL; }
37
38   virtual bool call_load();
39   virtual void call_unload();
40
41   disk_data *token() { return &m_token; }
42protected:
43   // device-level overrides
44   virtual void device_config_complete();
45   virtual void device_start();
46   virtual void device_reset();
47
48   disk_data m_token;
49};
50
5117// device type definition
5218extern const device_type MESSIMG_DISK;
5319
r29180r29181
6531};
6632
6733
68/***************************************************************************
69 get_safe_disk_token - makes sure that the passed in device is a messimg disk
70 ***************************************************************************/
71
72INLINE disk_data *get_safe_disk_token(device_t *device) {
73   assert(device != NULL);
74   assert(device->type() == MESSIMG_DISK);
75   return (disk_data *) downcast<messimg_disk_image_device *>(device)->token();
76}
77
7834/*-------------------------------------------------
7935    device start callback
8036-------------------------------------------------*/
8137
8238void messimg_disk_image_device::device_start()
8339{
84   disk_data *disk = get_safe_disk_token(this);
40   m_data = (UINT8 *)NULL;
8541
86   disk->device = this;
87   disk->image = this;
88   disk->data = (UINT8 *)NULL;
89
9042   if (exists() && fseek(0, SEEK_END) == 0)
9143   {
92      disk->size = (UINT32)ftell();
44      m_size = (UINT32)ftell();
9345   }
9446}
9547
9648bool messimg_disk_image_device::call_load()
9749{
98   disk_data *disk = get_safe_disk_token(this);
99
10050   fseek(0, SEEK_END);
101   disk->size = (UINT32)ftell();
102   if (disk->size > (256*1024*1024))
51   m_size = (UINT32)ftell();
52   if (m_size > (256*1024*1024))
10353   {
10454      printf("Mac image too large: must be 256MB or less!\n");
105      disk->size = 0;
55      m_size = 0;
10656      return IMAGE_INIT_FAIL;
10757   }
10858
109   disk->data = (UINT8 *)auto_alloc_array_clear(machine(), UINT32, disk->size/sizeof(UINT32));
59   m_data = (UINT8 *)auto_alloc_array_clear(machine(), UINT32, m_size/sizeof(UINT32));
11060   fseek(0, SEEK_SET);
111   fread(disk->data, disk->size);
112   disk->ejected = false;
61   fread(m_data, m_size);
62   m_ejected = false;
11363
11464   return IMAGE_INIT_PASS;
11565}
11666
11767void messimg_disk_image_device::call_unload()
11868{
119   disk_data *disk = get_safe_disk_token(this);
120
12169   // TODO: track dirty sectors and only write those
12270   fseek(0, SEEK_SET);
123   fwrite(disk->data, disk->size);
124   disk->size = 0;
125   //free(disk->data);
71   fwrite(m_data, m_size);
72   m_size = 0;
73   //free(m_data);
12674}
12775
12876/*-------------------------------------------------
r29180r29181
210158   m_nubus->install_device(slotspace+4, slotspace+7, read32_delegate(FUNC(nubus_image_device::image_status_r), this), write32_delegate(FUNC(nubus_image_device::image_status_w), this));
211159   m_nubus->install_device(superslotspace, superslotspace+((256*1024*1024)-1), read32_delegate(FUNC(nubus_image_device::image_super_r), this), write32_delegate(FUNC(nubus_image_device::image_super_w), this));
212160
213   device_t *device0 = subdevice(IMAGE_DISK0_TAG);
214   m_image = (disk_data *) downcast<messimg_disk_image_device *>(device0)->token();
161   m_image = subdevice<messimg_disk_image_device>(IMAGE_DISK0_TAG);
215162}
216163
217164//-------------------------------------------------
r29180r29181
224171
225172WRITE32_MEMBER( nubus_image_device::image_status_w )
226173{
227   m_image->ejected = true;
174   m_image->m_ejected = true;
228175}
229176
230177READ32_MEMBER( nubus_image_device::image_status_r )
231178{
232   if(m_image->ejected) {
179   if(m_image->m_ejected) {
233180      return 0;
234181   }
235182
236   if(m_image->size) {
183   if(m_image->m_size) {
237184      return 1;
238185   }
239186   return 0;
r29180r29181
245192
246193READ32_MEMBER( nubus_image_device::image_r )
247194{
248   return m_image->size;
195   return m_image->m_size;
249196}
250197
251198WRITE32_MEMBER( nubus_image_device::image_super_w )
252199{
253   UINT32 *image = (UINT32*)m_image->data;
200   UINT32 *image = (UINT32*)m_image->m_data;
254201   data = ((data & 0xff) << 24) | ((data & 0xff00) << 8) | ((data & 0xff0000) >> 8) | ((data & 0xff000000) >> 24);
255202   mem_mask = ((mem_mask & 0xff) << 24) | ((mem_mask & 0xff00) << 8) | ((mem_mask & 0xff0000) >> 8) | ((mem_mask & 0xff000000) >> 24);
256203
r29180r29181
259206
260207READ32_MEMBER( nubus_image_device::image_super_r )
261208{
262   UINT32 *image = (UINT32*)m_image->data;
209   UINT32 *image = (UINT32*)m_image->m_data;
263210   UINT32 data = image[offset];
264211   return ((data & 0xff) << 24) | ((data & 0xff00) << 8) | ((data & 0xff0000) >> 8) | ((data & 0xff000000) >> 24);
265212}
trunk/src/emu/bus/nubus/nubus_image.h
r29180r29181
1010//  TYPE DEFINITIONS
1111//**************************************************************************
1212
13struct disk_data
13// messimg_disk_image_device
14
15class messimg_disk_image_device :   public device_t,
16                        public device_image_interface
1417{
15   device_t *device;
16   UINT32 size;
17   UINT8 *data;
18   bool ejected;
18public:
19   // construction/destruction
20   messimg_disk_image_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
1921
20   device_image_interface *image;
22   // image-level overrides
23   virtual iodevice_t image_type() const { return IO_QUICKLOAD; }
24
25   virtual bool is_readable()  const { return 1; }
26   virtual bool is_writeable() const { return 1; }
27   virtual bool is_creatable() const { return 0; }
28   virtual bool must_be_loaded() const { return 0; }
29   virtual bool is_reset_on_load() const { return 0; }
30   virtual const char *image_interface() const { return NULL; }
31   virtual const char *file_extensions() const { return "img"; }
32   virtual const option_guide *create_option_guide() const { return NULL; }
33
34   virtual bool call_load();
35   virtual void call_unload();
36
37   protected:
38   // device-level overrides
39   virtual void device_config_complete();
40   virtual void device_start();
41   virtual void device_reset();
42public:
43   UINT32 m_size;
44   UINT8 *m_data;
45   bool m_ejected;
2146};
2247
2348// ======================> nubus_image_device
r29180r29181
4873      DECLARE_WRITE32_MEMBER(image_super_w);
4974
5075public:
51   disk_data *m_image;
76   messimg_disk_image_device *m_image;
5277};
5378
5479

Previous 199869 Revisions Next


© 1997-2024 The MAME Team