Previous 15994 Revisions Next

r7306 Wednesday 10th February, 2010 at 12:46:31 UTC by Dirk Best
[WD17XX] Updated double density input interface. Driver authors: Please verify that your driver still works as before, there are probably new cleanup possibilities too.
[src/mame/machine]archimds.c
[src/mess/devices]coco_fdc.c thomflop.c
[src/mess/drivers]a310.c apricot.c apricotf.c atarist.c bw2.c enterp.c fm7.c fmtowns.c ht68k.c nascom1.c orion.c pk8020.c samcoupe.c tiki100.c v1050.c vector06.c x1.c xerox820.c xor100.c
[src/mess/includes]orion.h
[src/mess/machine]99_dsk.c bbc.c beta.c c1571.c c1581.c concept.c conkort.c dgn_beta.c kaypro.c mbee.c msx.c nascom1.c oric.c orion.c osborne1.c partner.c pk8020.c rmnimbus.c special.c svi318.c trs80.c vector06.c wd17xx.c wd17xx.h z80ne.c

src/mame/machine/archimds.c
r7305r7306
483483   else if (offset == 0xd40010)
484484   {
485485      // latch B
486      wd17xx_set_density(fdc,(data & 2) ? DEN_MFM_LO : DEN_MFM_HI);
486      wd17xx_dden_w(fdc, BIT(data, 1));
487487   }
488488   #endif
489489   else
src/mess/devices/coco_fdc.c
r7305r7306
148148
149149static const wd17xx_interface coco_wd17xx_interface =
150150{
151   DEVCB_NULL,
151152   DEVCB_LINE(fdc_intrq_w),
152153   DEVCB_LINE(fdc_drq_w),
153154   {FLOPPY_0,FLOPPY_1,FLOPPY_2,FLOPPY_3}
r7305r7306
360361
361362   wd17xx_set_drive(fdc->wd17xx, drive);
362363   wd17xx_set_side(fdc->wd17xx, head);
363   wd17xx_set_density(fdc->wd17xx, (fdc->dskreg & 0x20) ? DEN_MFM_LO : DEN_FM_LO);
364   wd17xx_dden_w(fdc->wd17xx, !BIT(fdc->dskreg, 5));
364365}
365366
366367
r7305r7306
484485   static MACHINE_DRIVER_START(coco_fdc)
485486      MDRV_WD1773_ADD(WD_TAG, coco_wd17xx_interface)
486487      MDRV_MSM6242_ADD(DISTO_TAG)
487      MDRV_DS1315_ADD(CLOUD9_TAG)     
488      MDRV_DS1315_ADD(CLOUD9_TAG)
488489   MACHINE_DRIVER_END
489490
490491   static const fdc_hardware_type hwtype =
r7305r7306
555556   if (data & 0x04)
556557      wd17xx_set_drive(fdc->wd17xx, data & 0x03);
557558
558   wd17xx_set_density(fdc->wd17xx, (data & 0x08) ? DEN_FM_LO: DEN_MFM_LO);
559   wd17xx_dden_w(fdc->wd17xx, BIT(data, 3));
559560   fdc->dskreg = data;
560561}
561562
src/mess/devices/thomflop.c
r7305r7306
295295   {
296296      /* drive select */
297297      int drive = -1, side = 0;
298      DENSITY dens;
299298
300299      switch ( data & 7 )
301300      {
r7305r7306
308307         logerror( "%f $%04x to7_5p14_w: invalid drive select pattern $%02X\n", attotime_to_double(timer_get_time(space->machine)), cpu_get_previouspc(devtag_get_device(space->machine, "maincpu")), data );
309308      }
310309
311      dens = (data & 0x80) ? DEN_FM_LO : DEN_MFM_LO;
312      wd17xx_set_density( fdc, dens );
310      wd17xx_dden_w(fdc, BIT(data, 7));
313311
314312      to7_5p14_select = data;
315313
r7305r7306
320318         wd17xx_set_side( fdc, side );
321319         LOG(( "%f $%04x to7_5p14_w: $%02X set drive=%i side=%i density=%s\n",
322320               attotime_to_double(timer_get_time(space->machine)), cpu_get_previouspc(devtag_get_device(space->machine, "maincpu")),
323               data, drive, side, (dens == DEN_FM_LO) ? "FM" : "MFM" ));
321               data, drive, side, (BIT(data, 7) ? "FM" : "MFM")));
324322      }
325323   }
326324   else
r7305r7306
13321330
13331331   case 0: /* CMD0 */
13341332   {
1335      DENSITY dens = (data & 0x20) ? DEN_FM_LO : DEN_MFM_LO;
13361333      int wsync = (data >> 4) & 1;
13371334      int qdd = thmfc_floppy_is_qdd(thmfc_floppy_image(space->machine));
13381335      chrn_id id;
13391336      thmfc1->formatting = (data >> 2) & 1;
13401337      LOG (( "%f $%04x thmfc_floppy_w: CMD0=$%02X dens=%s wsync=%i dsync=%i fmt=%i op=%i\n",
13411338             attotime_to_double(timer_get_time(space->machine)), cpu_get_previouspc(devtag_get_device(space->machine, "maincpu")), data,
1342             (dens == DEN_FM_LO) ? "MF" : "MFM",
1339             (BIT(data, 5) ? "FM" : "MFM"),
13431340             wsync, (data >> 3) & 1,
13441341             thmfc1->formatting, data & 3 ));
13451342
src/mess/includes/orion.h
r7305r7306
4444extern WRITE8_HANDLER ( orionz80_io_w );
4545
4646extern DRIVER_INIT( orionpro );
47extern MACHINE_START( orionpro );
4847extern MACHINE_RESET( orionpro );
4948extern READ8_HANDLER ( orionpro_io_r );
5049extern WRITE8_HANDLER ( orionpro_io_w );
src/mess/machine/dgn_beta.c
r7305r7306
263263static int   EnableMapRegs;      /* Should we use map registers, or just map normal */
264264static struct PageReg   PageRegs[MaxTasks+1][MaxPage+1];   /* 16 sets of 16 page regs, allowing for 16 seperate contexts */
265265                                                            /* Task 17 is power on default, when banking not enabled */
266                                                           
266
267267#define is_last_page(page)  (((page==LastPage) || (page==LastPage+1)) ? 1 : 0)
268268
269269//
r7305r7306
731731   wd17xx_set_drive(fdc, ~data & DSMask);
732732
733733   /* Set density of WD2797 */
734   if (data & DDenCtrl)
735   {
736      wd17xx_set_density(fdc, DEN_FM_LO);
737      LOG_DISK(("Set density low %d\n", (data & DDenCtrl)));
738   }
739   else
740   {
741      wd17xx_set_density(fdc, DEN_MFM_LO);
742      LOG_DISK(("Set density high %d\n", (data & DDenCtrl)));
743   }
734   wd17xx_dden_w(fdc, BIT(data, 6));
735   LOG_DISK(("Set density %s\n", BIT(data, 6) ? "low" : "high"));
744736}
745737
746738static READ8_DEVICE_HANDLER(d_pia1_pb_r)
r7305r7306
11161108   DMA_NMI_LAST = 0x80;      /* start with DMA NMI inactive, as pulled up */
11171109//  DMA_NMI = CLEAR_LINE;       /* start with DMA NMI inactive */
11181110
1119   wd17xx_set_density(fdc, DEN_MFM_LO);
1111   wd17xx_dden_w(fdc, CLEAR_LINE);
11201112   wd17xx_set_drive(fdc, 0);
11211113
11221114   machine->generic.videoram.u8 = messram_get_ptr(devtag_get_device(machine, "messram"));      /* Point video ram at the start of physical ram */
1123   
1115
11241116    dgnbeta_video_reset(machine);
11251117    wd17xx_reset(fdc);
11261118    wd2797_written=0;
r7305r7306
11291121MACHINE_START( dgnbeta )
11301122{
11311123   logerror("MACHINE_START( dgnbeta )\n");
1132   
1124
11331125    dgnbeta_init_video(machine);
11341126
11351127   debug_cpu_set_dasm_override(devtag_get_device(machine, MAINCPU_TAG), CPU_DISASSEMBLE_NAME(dgnbeta_dasm_override));
src/mess/machine/conkort.c
r7305r7306
615615   slow_t *conkort = get_safe_token_machine_slow(device->machine);
616616
617617   /* disk density */
618   wd17xx_set_density(conkort->wd1791, BIT(data, 3) ? DEN_FM_HI : DEN_FM_LO);
619618   conkort->fdc_dden = BIT(data, 3);
619   wd17xx_dden_w(conkort->wd1791, conkort->fdc_dden);
620620}
621621
622622static WRITE_LINE_DEVICE_HANDLER( conkort_pio_ardy_w )
r7305r7306
737737
738738static const wd17xx_interface slow_wd17xx_interface =
739739{
740   DEVCB_NULL,
740741   DEVCB_LINE(slow_wd1791_intrq_w),
741742   DEVCB_LINE(slow_wd1791_drq_w),
742743   { FLOPPY_0, FLOPPY_1, NULL, NULL }
r7305r7306
747748static const wd17xx_interface fast_wd17xx_interface =
748749{
749750   DEVCB_NULL,
751   DEVCB_NULL,
750752   DEVCB_DEVICE_LINE(Z80DMA_TAG, z80dma_rdy_w),
751753   { FLOPPY_0, FLOPPY_1, NULL, NULL }
752754};
src/mess/machine/c1581.c
r7305r7306
8585
8686   int atn = cbm_iec_atn_r(c1581->serial_bus);
8787   int data = !c1581->data_out & !(c1581->atn_ack & !atn);
88   
88
8989   /* fast serial data */
9090   if (c1581->ser_dir) data &= c1581->sp_out;
91   
91
9292   cbm_iec_data_w(c1581->serial_bus, device, data);
9393}
9494
r7305r7306
9797   c1581_t *c1581 = get_safe_token(device);
9898
9999   int srq = 1;
100   
100
101101   /* fast serial clock */
102102   if (c1581->ser_dir) srq &= c1581->cnt_out;
103103
r7305r7306
365365
366366static const wd17xx_interface wd1770_intf =
367367{
368   DEVCB_LINE_GND,
368369   DEVCB_NULL,
369370   DEVCB_NULL,
370371   { FLOPPY_0, NULL, NULL, NULL }
r7305r7306
464465   c1581->serial_bus = devtag_get_device(device->machine, config->serial_bus_tag);
465466   c1581->image = device->subdevice(FLOPPY_0);
466467
467   /* set floppy density */
468   wd17xx_set_density(c1581->wd1770, DEN_MFM_LO); // _DDEN = low
469
470468   /* register for state saving */
471469   state_save_register_device_item(device, 0, c1581->address);
472470   state_save_register_device_item(device, 0, c1581->data_out);
src/mess/machine/mbee.c
r7305r7306
165165
166166   wd17xx_set_drive(mbee_fdc, data & 3);
167167   wd17xx_set_side(mbee_fdc, (data & 4) ? 1 : 0);
168   wd17xx_set_density(mbee_fdc, (DENSITY)((data & 8) ? 1 : 0));
168   wd17xx_dden_w(mbee_fdc, !BIT(data, 3));
169169}
170170
171171/***********************************************************
src/mess/machine/99_dsk.c
r7305r7306
393393
394394const wd17xx_interface ti99_wd17xx_interface =
395395{
396   DEVCB_NULL,
396397   DEVCB_LINE(ti99_fdc_intrq_w),
397398   DEVCB_LINE(ti99_fdc_drq_w),
398399   {FLOPPY_0, FLOPPY_1, FLOPPY_2, FLOPPY_3}
r7305r7306
456457   ti99_peb_set_card_handlers(0x1100, & fdc_handlers);
457458   if (fdc) {
458459      wd17xx_reset(fdc);      /* resets the fdc */
459      wd17xx_set_density(fdc,DEN_FM_LO);
460      wd17xx_dden_w(fdc, ASSERT_LINE);
460461   }
461462}
462463
r7305r7306
668669   ti99_peb_set_card_handlers(0x1100, & ccfdc_handlers);
669670
670671   wd17xx_reset(fdc);      /* initialize the floppy disk controller */
671   wd17xx_set_density(fdc,DEN_MFM_LO);
672   wd17xx_dden(fdc, CLEAR_LINE);
672673}
673674#endif
674675
r7305r7306
778779
779780   case 10:
780781      /* double density enable (active low) */
781      wd17xx_set_density(fdc,data ? DEN_FM_LO : DEN_MFM_LO);
782      wd17xx_dden(fdc, data ? ASSERT_LINE : CLEAR_LINE);
782783      break;
783784
784785   case 11:
r7305r7306
888889   ti99_peb_set_card_handlers(0x1100, & bwg_handlers);
889890
890891   wd17xx_reset(fdc);      /* initialize the floppy disk controller */
891   wd17xx_set_density(fdc,DEN_MFM_LO);
892   wd17xx_dden_w(fdc, CLEAR_LINE);
892893}
893894
894895/*
r7305r7306
996997
997998   case 10:
998999      /* double density enable (active low) */
999      wd17xx_set_density(fdc,data ? DEN_FM_LO : DEN_MFM_LO);
1000      wd17xx_dden_w(fdc, data ? ASSERT_LINE : CLEAR_LINE);
10001001      break;
10011002
10021003   case 11:
src/mess/machine/oric.c
r7305r7306
994994         /* bit 0: enable FDC IRQ to trigger IRQ on CPU */
995995         wd17xx_set_drive(fdc,(data>>5) & 0x03);
996996         wd17xx_set_side(fdc,(data>>4) & 0x01);
997         if (data & (1<<3))
998         {
999            density = DEN_MFM_LO;
1000         }
1001         else
1002         {
1003            density = DEN_FM_HI;
1004         }
997         wd17xx_dden_w(fdc, !BIT(data, 3));
1005998
1006         wd17xx_set_density(fdc,density);
1007
1008999         oric_microdisc_set_mem_0x0c000(space->machine);
10091000         oric_microdisc_refresh_wd179x_ints(space->machine);
10101001      }
src/mess/machine/vector06.c
r7305r7306
178178
179179MACHINE_START( vector06 )
180180{
181   running_device *fdc = devtag_get_device(machine, "wd1793");
182   wd17xx_set_density (fdc, DEN_FM_HI);
183181   timer_pulse(machine, ATTOTIME_IN_HZ(50), NULL, 0, reset_check_callback);
184182}
185183
src/mess/machine/orion.c
r7305r7306
7070
7171MACHINE_START( orion128 )
7272{
73   running_device *fdc = devtag_get_device(machine, "wd1793");
74
75   wd17xx_set_density (fdc,DEN_FM_HI);
7673   orion_video_mode_mask = 7;
7774}
7875
r7305r7306
263260
264261MACHINE_START( orionz80 )
265262{
266   running_device *fdc = devtag_get_device(machine, "wd1793");
267
268   wd17xx_set_density (fdc,DEN_FM_HI);
269263   mc146818_init(machine, MC146818_IGNORE_CENTURY);
270264   orion_video_mode_mask = 7;
271265}
r7305r7306
449443}
450444
451445
452MACHINE_START( orionpro )
453{
454   running_device *fdc = devtag_get_device(machine, "wd1793");
455   wd17xx_set_density (fdc,DEN_FM_HI);
456}
457
458446static WRITE8_HANDLER ( orionpro_memory_page_w );
459447
460448static void orionpro_bank_switch(running_machine *machine)
src/mess/machine/nascom1.c
r7305r7306
6868
6969const wd17xx_interface nascom2_wd17xx_interface =
7070{
71   DEVCB_LINE_VCC,
7172   DEVCB_LINE(nascom2_fdc_intrq_w),
7273   DEVCB_LINE(nascom2_fdc_drq_w),
7374   {FLOPPY_0, FLOPPY_1, FLOPPY_2, FLOPPY_3}
r7305r7306
272273   ay31015_set_input_pin( nascom1_hd6402, AY31015_CS, 1 );
273274}
274275
275MACHINE_RESET( nascom2 )
276{
277   running_device *fdc = devtag_get_device(machine, "wd1793");
278
279   wd17xx_set_density(fdc,DEN_FM_HI);
280
281   MACHINE_RESET_CALL(nascom1);
282}
283
284276DRIVER_INIT( nascom1 )
285277{
286278   switch (messram_get_size(devtag_get_device(machine, "messram")))
src/mess/machine/osborne1.c
r7305r7306
287287   running_device *fdc = devtag_get_device(device->machine, "mb8877");
288288
289289   osborne1.new_start_x = data >> 1;
290   wd17xx_set_density(fdc, ( data & 0x01 ) ? DEN_FM_LO : DEN_FM_HI );
290   wd17xx_dden_w(fdc, BIT(data, 0));
291291
292   //logerror("Video pia port a write: %02X, density set to %s\n", data, data & 1 ? "DEN_FM_LO" : "DEN_FM_HI" );
292   //logerror("Video pia port a write: %02X, density set to %s\n", data, data & 1 ? "FM" : "MFM" );
293293}
294294
295295
r7305r7306
432432   switch( size )
433433   {
434434   case 40 * 10 * 256:
435      wd17xx_set_density( fdc, DEN_FM_LO );
435      wd17xx_dden_w(fdc, ASSERT_LINE);
436436      break;
437437   case 40 * 5 * 1024:
438      wd17xx_set_density( fdc, DEN_FM_HI );
438      wd17xx_dden_w(fdc, CLEAR_LINE);
439439      break;
440440   case 40 * 8 * 512:
441      wd17xx_set_density( fdc, DEN_FM_LO );
441      wd17xx_dden_w(fdc, ASSERT_LINE);
442442      break;
443443   case 40 * 18 * 128:
444      wd17xx_set_density( fdc, DEN_FM_LO );
444      wd17xx_dden_w(fdc, ASSERT_LINE);
445445      break;
446446   case 40 * 9 * 512:
447      wd17xx_set_density( fdc, DEN_FM_HI );
447      wd17xx_dden_w(fdc, CLEAR_LINE);
448448      break;
449449   }
450450}
src/mess/machine/wd17xx.c
r7305r7306
110110
111111    2010-Jan-31 Phill Harvey-Smith
112112    - The above bugfixes for the Kaypro/Osborne1 have borked the booting on the Dragon
113      Alpha. The Alpha it seems needs a delay of ay least 17us or the NMI generated by
113      Alpha. The Alpha it seems needs a delay of ay least 17us or the NMI generated by
114114      INTRQ happens too early and doen't break out of the read/write bytes loops.
115     
115
116116      I have made the delay settable by calling wd17xx_set_complete_command_delay, and
117117      let it default to 12us, as required above, so that the Dragon Alpha works again.
118118      This hopefully should not break the other machines.
119     
119
120120      This should probably be considdered a minor hack but it does seem to work !
121121
122122    2009-02-04 Phill Harvey-Smith
r7305r7306
270270struct _wd1770_state
271271{
272272   /* callbacks */
273   devcb_resolved_read_line in_dden_func;
273274   devcb_resolved_write_line out_intrq_func;
274275   devcb_resolved_write_line out_drq_func;
275276
r7305r7306
297298
298299   int stepping_rate[4];  /* track stepping rate in ms */
299300
300
301   DENSITY   density;            /* FM/MFM, single / double density */
302
303301   UINT8   track_reg;            /* value of track register */
304302   UINT8   command_type;         /* last command type */
305303   UINT8   head;               /* current head # */
r7305r7306
339337
340338   /* pause time when writing/reading sector */
341339   int pause_time;
342   
340
343341    /* complete command delay */
344342    int complete_command_delay;
345343
r7305r7306
354352
355353const wd17xx_interface default_wd17xx_interface =
356354{
357   DEVCB_NULL, DEVCB_NULL, { FLOPPY_0, FLOPPY_1, FLOPPY_2, FLOPPY_3}
355   DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, { FLOPPY_0, FLOPPY_1, FLOPPY_2, FLOPPY_3}
358356};
359357
360358const wd17xx_interface default_wd17xx_interface_2_drives =
361359{
362   DEVCB_NULL, DEVCB_NULL, { FLOPPY_0, FLOPPY_1, NULL, NULL}
360   DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, { FLOPPY_0, FLOPPY_1, NULL, NULL}
363361};
364362
365363
r7305r7306
388386/***************************************************************************
389387    HELPER FUNCTIONS
390388***************************************************************************/
389
391390static int wd17xx_has_side_select(running_device *device)
392391{
393392   return (device->type == WD1773 || device->type == WD1793 || device->type == WD2793);
394393}
395394
396static int wd17xx_get_datarate_in_us(DENSITY density)
395static int wd17xx_dden(running_device *device)
397396{
398   switch (density)
399   {
400      case DEN_FM_LO:  return 128;
401      case DEN_FM_HI:    return  64;
402      default:
403      case DEN_MFM_LO: return  32;
404      case DEN_MFM_HI: return  16;
405   }
406   return 32;
397   wd1770_state *w = get_safe_token(device);
398
399   if (w->in_dden_func.read != NULL)
400      return devcb_call_read_line(&w->in_dden_func);
401   else
402      return w->dden;
407403}
408404
409405
r7305r7306
562558   if (device->type == WD1771)
563559      w->data_count = TRKSIZE_SD;
564560   else
565      w->data_count = (w->density) ? TRKSIZE_DD : TRKSIZE_SD;
561      w->data_count = wd17xx_dden(device) ? TRKSIZE_SD : TRKSIZE_DD;
566562
567563   floppy_drive_write_track_data_info_buffer( w->drive, w->hd, (char *)w->buffer, &(w->data_count) );
568564
r7305r7306
700696   if (device->type == WD1771)
701697      w->data_count = TRKSIZE_SD;
702698   else
703      w->data_count = (w->density) ? TRKSIZE_DD : TRKSIZE_SD;
699      w->data_count = wd17xx_dden(device) ? TRKSIZE_SD : TRKSIZE_SD;
704700
705701   floppy_drive_read_track_data_info_buffer( w->drive, w->hd, (char *)w->buffer, &(w->data_count) );
706702
r7305r7306
10561052/* setup a timed data request - data request will be triggered in a few usecs time */
10571053static void wd17xx_timed_data_request(running_device *device)
10581054{
1059   int usecs;
10601055   wd1770_state *w = get_safe_token(device);
10611056
1062   usecs = wd17xx_get_datarate_in_us(w->density);
1063
10641057   /* set new timer */
1065   timer_adjust_oneshot(w->timer_data, ATTOTIME_IN_USEC(usecs), 0);
1058   timer_adjust_oneshot(w->timer_data, ATTOTIME_IN_USEC(wd17xx_dden(device) ? 128 : 32), 0);
10661059}
10671060
10681061
r7305r7306
10701063/* setup a timed read sector - read sector will be triggered in a few usecs time */
10711064static void wd17xx_timed_read_sector_request(running_device *device)
10721065{
1073   int usecs;
10741066   wd1770_state *w = get_safe_token(device);
10751067
1076   usecs = w->pause_time; /* How long should we wait? How about 40 micro seconds? */
1077
10781068   /* set new timer */
1079   timer_adjust_oneshot(w->timer_rs, ATTOTIME_IN_USEC(usecs), 0);
1069   timer_adjust_oneshot(w->timer_rs, ATTOTIME_IN_USEC(w->pause_time), 0);
10801070}
10811071
10821072
r7305r7306
10841074/* setup a timed write sector - write sector will be triggered in a few usecs time */
10851075static void wd17xx_timed_write_sector_request(running_device *device)
10861076{
1087   int usecs;
10881077   wd1770_state *w = get_safe_token(device);
10891078
1090   usecs = w->pause_time; /* How long should we wait? How about 40 micro seconds? */
1091
10921079   /* set new timer */
1093   timer_adjust_oneshot(w->timer_ws, ATTOTIME_IN_USEC(usecs), 0);
1080   timer_adjust_oneshot(w->timer_ws, ATTOTIME_IN_USEC(w->pause_time), 0);
10941081}
10951082
10961083
r7305r7306
11321119   w->hd = head;
11331120}
11341121
1135void wd17xx_set_density(running_device *device, DENSITY density)
1136{
1137   wd1770_state *w = get_safe_token(device);
1138
1139   if (VERBOSE)
1140   {
1141      if (w->density != density)
1142         logerror("wd17xx_set_density: $%02x\n", density);
1143   }
1144
1145   w->density = density;
1146}
1147
11481122void wd17xx_set_pause_time(running_device *device, int usec)
11491123{
11501124   wd1770_state *w = get_safe_token(device);
r7305r7306
12191193   w->wprt = state;
12201194}
12211195
1196/* double density enable */
1197WRITE_LINE_DEVICE_HANDLER( wd17xx_dden_w )
1198{
1199   wd1770_state *w = get_safe_token(device);
1200
1201   /* not supported on FD1771, FD1792, FD1794, FD1762 and FD1764 */
1202   if (device->type == WD1771)
1203      fatalerror("wd17xx_dden_w: double density input not supported on this model!\n");
1204   else if (w->in_dden_func.read != NULL)
1205      logerror("wd17xx_dden_w: write has no effect because a read handler is already defined!\n");
1206   else
1207      w->dden = state;
1208}
1209
12221210/* data request */
12231211READ_LINE_DEVICE_HANDLER( wd17xx_drq_r )
12241212{
r7305r7306
15281516            if (device->type == WD1771)
15291517               w->data_count = TRKSIZE_SD;
15301518            else
1531               w->data_count = (w->density) ? TRKSIZE_DD : TRKSIZE_SD;
1519               w->data_count = wd17xx_dden(device) ? TRKSIZE_SD : TRKSIZE_DD;
1520
15321521            wd17xx_set_drq(device);
15331522            w->status |= STA_2_BUSY;
15341523            w->busy_count = 0;
r7305r7306
17561745
17571746         w->data_offset = 0;
17581747
1759           
1748
17601749         /* Check we should handle the next sector for a multi record write */
1761         if ( w->command_type == TYPE_II && w->command == FDC_WRITE_SEC && ( w->write_cmd & 0x10 ) )
1750         if ( w->command_type == TYPE_II && w->command == FDC_WRITE_SEC && ( w->write_cmd & 0x10 ) )
17621751            {
17631752            w->sector++;
17641753            if (wd17xx_locate_sector(device))
r7305r7306
18311820   w->intf = (const wd17xx_interface*)device->baseconfig().static_config;
18321821
18331822   w->status = STA_1_TRACK0;
1834   w->density = DEN_MFM_LO;
18351823   w->pause_time = 40;
18361824    w->complete_command_delay = 12;
18371825
r7305r7306
18421830   w->timer_ws = timer_alloc(device->machine, wd17xx_write_sector_callback, (void *)device);
18431831
18441832   /* resolve callbacks */
1833   devcb_resolve_read_line(&w->in_dden_func, &w->intf->in_dden_func, device);
18451834   devcb_resolve_write_line(&w->out_intrq_func, &w->intf->out_intrq_func, device);
18461835   devcb_resolve_write_line(&w->out_drq_func, &w->intf->out_drq_func, device);
18471836
src/mess/machine/wd17xx.h
r7305r7306
3232    TYPE DEFINITIONS
3333***************************************************************************/
3434
35typedef enum
36{
37   DEN_FM_LO = 0,
38   DEN_FM_HI,
39   DEN_MFM_LO,
40   DEN_MFM_HI
41} DENSITY;
42
4335/* Interface */
4436typedef struct _wd17xx_interface wd17xx_interface;
4537struct _wd17xx_interface
4638{
39   devcb_read_line in_dden_func;
4740   devcb_write_line out_intrq_func;
4841   devcb_write_line out_drq_func;
4942   const char *floppy_drive_tags[4];
r7305r7306
7164but will be put here for now until the flopdrv code has been finalised more */
7265void wd17xx_set_drive(running_device *device, UINT8);      /* set drive wd179x is accessing */
7366void wd17xx_set_side(running_device *device, UINT8);      /* set side wd179x is accessing */
74void wd17xx_set_density(running_device *device, DENSITY);   /* set density */
7567
7668void wd17xx_set_pause_time(running_device *device, int usec);       /* default is 40 usec if not set */
7769void wd17xx_set_complete_command_delay(running_device *device, int usec);   /* default is 12 usec if not set */
r7305r7306
9587WRITE_LINE_DEVICE_HANDLER( wd17xx_tr00_w );
9688WRITE_LINE_DEVICE_HANDLER( wd17xx_idx_w );
9789WRITE_LINE_DEVICE_HANDLER( wd17xx_wprt_w );
90WRITE_LINE_DEVICE_HANDLER( wd17xx_dden_w );
9891READ_LINE_DEVICE_HANDLER( wd17xx_drq_r );
9992READ_LINE_DEVICE_HANDLER( wd17xx_intrq_r );
10093
src/mess/machine/trs80.c
r7305r7306
641641      wd17xx_set_side(trs80_fdc,head);
642642   }
643643
644   wd17xx_set_density(trs80_fdc, (DENSITY)((data & 0x80) ? 1 : 0));
644   wd17xx_dden_w(trs80_fdc, !BIT(data, 7));
645645}
646646
647647WRITE8_HANDLER( sys80_f8_w )
src/mess/machine/svi318.c
r7305r7306
350350
351351static WRITE8_HANDLER( svi318_fdc_density_side_w )
352352{
353   //running_device *image;
354353   running_device *fdc = devtag_get_device(space->machine, "wd179x");
355354
356   wd17xx_set_density(fdc, data & 0x01 ? DEN_FM_LO:DEN_MFM_LO);
357
358   wd17xx_set_side(fdc, data & 0x02 ? 1:0);
355   wd17xx_dden_w(fdc, BIT(data, 0));
356   wd17xx_set_side(fdc, BIT(data, 1));
359357}
360358
361359static READ8_HANDLER( svi318_fdc_irqdrq_r )
src/mess/machine/z80ne.c
r7305r7306
395395
396396MACHINE_RESET(z80netf)
397397{
398   running_device *z80ne_fdc;
399
400398   LOG(("In MACHINE_RESET z80netf\n"));
401399   reset_lx390_banking(machine);
402400   MACHINE_RESET_CALL( z80ne_base );
403401   reset_lx388(machine);
404   z80ne_fdc = devtag_get_device(machine, "wd1771");
405   wd17xx_set_density (z80ne_fdc, DEN_FM_HI); /* Datarate 64 usec */
406402}
407403
408404INPUT_CHANGED( z80ne_reset )
r7305r7306
436432   state_save_register_item_array( machine, "z80ne", NULL, 0, lx383_key );
437433   state_save_register_item( machine, "z80ne", NULL, 0, nmi_delay_counter );
438434   cassette_timer = timer_alloc(machine, z80ne_cassette_tc, NULL);
439    timer_pulse(machine,  ATTOTIME_IN_HZ(1000), NULL, 0, z80ne_kbd_scan );   
435    timer_pulse(machine,  ATTOTIME_IN_HZ(1000), NULL, 0, z80ne_kbd_scan );
440436}
441437
442438MACHINE_START( z80net )
src/mess/machine/concept.c
r7305r7306
648648      /*motor_on = (data & LC_MOTOROF_mask) == 0;*/
649649      // floppy_drive_set_motor_state(floppy_get_device(machine,  current_drive), (data & LC_MOTOROF_mask) == 0 ? 1 : 0);
650650      /*flp_8in = (data & LC_FLP8IN_mask) != 0;*/
651      wd17xx_set_density(fdc, (data & LC_FMMFM_mask) ? DEN_FM_LO : DEN_MFM_LO);
651      wd17xx_dden_w(fdc, BIT(data, 7));
652652      floppy_drive_set_ready_state(floppy_get_device(space->machine, current_drive), 1, 0);
653653      break;
654654
src/mess/machine/msx.c
r7305r7306
326326
327327MACHINE_START( msx2 )
328328{
329   running_device *fdc = devtag_get_device(machine, "wd179x");
330   wd17xx_set_density (fdc,DEN_FM_HI);
331329   msx1.dsk_stat = 0x7f;
332330}
333331
r7305r7306
734732
735733const wd17xx_interface msx_wd17xx_interface =
736734{
735   DEVCB_LINE_VCC,
737736   DEVCB_LINE(msx_wd179x_intrq_w),
738737   DEVCB_LINE(msx_wd179x_drq_w),
739738   {FLOPPY_0, FLOPPY_1, NULL, NULL}
src/mess/machine/kaypro.c
r7305r7306
6868      memory_set_bankptr(mem->machine, "bank3", memory_region(mem->machine, "rambank"));
6969   }
7070
71   wd17xx_set_density(kaypro_fdc, (DENSITY)((data & 0x20) ? 0 : 1));
71   wd17xx_dden_w(kaypro_fdc, BIT(data, 5));
7272
7373   centronics_strobe_w(kaypro_printer, BIT(data, 4));
7474
r7305r7306
179179      memory_set_bankptr(mem->machine, "bank3", memory_region(mem->machine, "rambank"));
180180   }
181181
182   wd17xx_set_density(kaypro_fdc, (DENSITY)((data & 0x20) ? 0 : 1));
182   wd17xx_dden_w(kaypro_fdc, BIT(data, 5));
183183
184184   centronics_strobe_w(kaypro_printer, BIT(data, 3));
185185
src/mess/machine/beta.c
r7305r7306
8989
9090static const wd17xx_interface beta_wd17xx_interface =
9191{
92   DEVCB_NULL,
9293   DEVCB_LINE(betadisk_wd179x_intrq_w),
9394   DEVCB_LINE(betadisk_wd179x_drq_w),
9495   {FLOPPY_0, FLOPPY_1, FLOPPY_2, FLOPPY_3}
r7305r7306
157158   if (beta->betadisk_active==1) {
158159        wd17xx_set_drive(beta->wd179x, data & 3);
159160        wd17xx_set_side (beta->wd179x,(data & 0x10) ? 0 : 1 );
160        wd17xx_set_density(beta->wd179x, data & 0x20 ? DEN_MFM_HI : DEN_FM_LO );
161        wd17xx_dden_w(beta->wd179x, !BIT(data, 5));
161162        if ((data & 0x04) == 0) // reset
162163        {
163164           wd17xx_reset(beta->wd179x);
src/mess/machine/partner.c
r7305r7306
3737
3838const wd17xx_interface partner_wd17xx_interface =
3939{
40   DEVCB_LINE_GND,
4041   DEVCB_NULL,
4142   DEVCB_DEVICE_LINE("dma8257", partner_wd17xx_drq_w),
4243   {FLOPPY_0, FLOPPY_1, NULL, NULL}
4344};
4445
45MACHINE_START(partner)
46MACHINE_START( partner )
4647{
4748   running_device *fdc = devtag_get_device(machine, "wd1793");
48   wd17xx_set_density (fdc,DEN_MFM_HI);
49   wd17xx_set_pause_time(fdc,10);
49   wd17xx_set_pause_time(fdc, 10);
5050}
5151
5252static void partner_window_1(running_machine *machine, UINT8 bank_num, UINT16 offset,UINT8 *rom)
src/mess/machine/special.c
r7305r7306
254254MACHINE_START( specimx )
255255{
256256   running_device *fdc = devtag_get_device(machine, "wd1793");
257   wd17xx_set_density (fdc,DEN_FM_HI);
257   wd17xx_dden_w(fdc, ASSERT_LINE);
258258}
259259
260260static TIMER_CALLBACK( setup_pit8253_gates )
r7305r7306
423423
424424   wd17xx_set_side (fdc,data & 1);
425425   wd17xx_set_drive(fdc,(data >> 1) & 1);
426   if((data >>2) & 1)
427   {
428      wd17xx_set_density (fdc,DEN_FM_LO);
429   }
430   else
431   {
432      wd17xx_set_density (fdc,DEN_FM_HI);
433   }
426   wd17xx_dden_w(fdc, BIT(data, 2));
434427}
src/mess/machine/rmnimbus.c
r7305r7306
1/*
1/*
22    machine/rmnimbus.c
3   
3
44    Machine driver for the Research Machines Nimbus.
5   
5
66    Phill Harvey-Smith
77    2009-11-29.
8   
8
99    80186 internal DMA/Timer/PIC code borrowed from Compis driver.
1010    Perhaps this needs merging into the 80186 core.....
1111*/
r7305r7306
146146
147147const wd17xx_interface nimbus_wd17xx_interface =
148148{
149   DEVCB_LINE_GND,
149150   DEVCB_LINE(nimbus_fdc_intrq_w),
150151   DEVCB_LINE(nimbus_fdc_drq_w),
151152   {FLOPPY_0, FLOPPY_1, FLOPPY_2, FLOPPY_3}
r7305r7306
189190    0x0280, 0x017F, 0xE822, 0x8129,
190191    0x0329, 0x0000, 0x0000, 0x0000,
191192    0x0000, 0x0000, 0x0000, 0x0000,
192    0x0000, 0x8796, 0x2025, 0xB9E6
193    0x0000, 0x8796, 0x2025, 0xB9E6
193194};
194195
195196/* IO Unit */
r7305r7306
265266    old=i186.intr.in_service;
266267
267268   i186.intr.in_service |= i186.intr.ack_mask;
268   
269
269270    if((LOG_INTERRUPTS) && (i186.intr.in_service!=old))
270271        logerror("i186.intr.in_service changed from %02X to %02X\n",old,i186.intr.in_service);
271   
272
272273    if (i186.intr.ack_mask == 0x0001)
273274   {
274275      switch (i186.intr.poll_status & 0x1f)
r7305r7306
298299        logerror("Ext vectors : %02X %02X\n",i186.intr.ext_vector[0],i186.intr.ext_vector[1]);
299300        logerror("Int %02X Calling vector %02X\n",i186.intr.poll_status,vector);
300301    }
301   
302
302303    return vector;
303304}
304305
305306
306307static void update_interrupt_state(running_machine *machine)
307{   
308{
308309    int new_vector = 0;
309310    int Priority;
310311    int IntNo;
311312
312   if (LOG_INTERRUPTS)
313   if (LOG_INTERRUPTS)
313314        logerror("update_interrupt_status: req=%04X stat=%04X serv=%04X priority_mask=%4X\n", i186.intr.request, i186.intr.status, i186.intr.in_service, i186.intr.priority_mask);
314315
315316   /* loop over priorities */
r7305r7306
365366         {
366367                if (LOG_INTERRUPTS)
367368                    logerror("Int%d priority=%d\n",IntNo,Priority);
368               
369
369370                /* if we're already servicing something at this level, don't generate anything new */
370371            if (i186.intr.in_service & (0x10 << IntNo))
371372               return;
r7305r7306
460461static void external_int(running_machine *machine, UINT16 intno, UINT8 vector)
461462{
462463   if (LOG_INTERRUPTS_EXT) logerror("generating external int %02X, vector %02X\n",intno,vector);
463
464
464465   // Only 4 external ints
465466    if(intno>3)
466467    {
467468        logerror("external_int() invalid external interupt no : 0x%02X (can only be 0..3)\n",intno);
468469        return;
469470    }
470   
471
471472    // Only set external vector if cascade mode enabled, only valid for
472473    // int 0 & int 1
473474    if (intno<2)
r7305r7306
475476        if(i186.intr.ext[intno] & EXTINT_CTRL_CASCADE)
476477            i186.intr.ext_vector[intno]=vector;
477478    }
478   
479
479480    // Turn on the requested request bit and handle interrupt
480481    i186.intr.request |= (0x010 << intno);
481482    update_interrupt_state(machine);
r7305r7306
552553   struct timer_state *t = &i186.timer[which];
553554   int update_int_timer = 0;
554555
555    if (LOG_TIMER)
556    if (LOG_TIMER)
556557        logerror("internal_timer_update: %d, new_count=%d, new_maxA=%d, new_maxB=%d,new_control=%d\n",which,new_count,new_maxA,new_maxB,new_control);
557558
558559   /* if we have a new count and we're on, update things */
r7305r7306
597598               new_maxB = 0x10000;
598599      }
599600      }
600   
601601
602
602603   /* handle control changes */
603604   if (new_control != -1)
604605   {
r7305r7306
754755    struct dma_state *dma = &i186.dma[which];
755756   const address_space *memory_space   = cpu_get_address_space(devtag_get_device(machine, MAINCPU_TAG), ADDRESS_SPACE_PROGRAM);
756757    const address_space *io_space       = cpu_get_address_space(devtag_get_device(machine, MAINCPU_TAG), ADDRESS_SPACE_IO);
757   
758
758759    const address_space *src_space;
759760    const address_space *dest_space;
760   
761
761762    UINT16  dma_word;
762763    UINT8   dma_byte;
763764    UINT8   incdec_size;
r7305r7306
769770    {
770771        logerror("%05X:ERROR! - drq%d with dma channel stopped\n",
771772         cpu_get_pc(devtag_get_device(machine, MAINCPU_TAG)), which);
772           
773
773774        return;
774775    }
775
776
776777    if(dma->control & DEST_MIO)
777778        dest_space=memory_space;
778779    else
779780        dest_space=io_space;
780   
781
781782    if(dma->control & SRC_MIO)
782783        src_space=memory_space;
783784    else
784785        src_space=io_space;
785   
786
786787    // Do the transfer
787788    if(dma->control & BYTE_WORD)
788789    {
r7305r7306
796797        memory_write_byte(dest_space,dma->dest,dma_byte);
797798        incdec_size=1;
798799    }
799   
800
800801    // Increment or Decrement destination ans source pointers as needed
801802    switch (dma->control & DEST_INCDEC_MASK)
802803    {
803804        case DEST_DECREMENT     : dma->dest -= incdec_size;
804805        case DEST_INCREMENT     : dma->dest += incdec_size;
805806    }
806   
807
807808    switch (dma->control & SRC_INCDEC_MASK)
808809    {
809810        case SRC_DECREMENT     : dma->source -= incdec_size;
810811        case SRC_INCREMENT     : dma->source += incdec_size;
811812    }
812   
813
813814    // decrement count
814815    dma->count -= 1;
815   
816
816817    // Terminate if count is zero, and terminate flag set
817818    if((dma->control & TERMINATE_ON_ZERO) && (dma->count==0))
818819    {
819820        dma->control &= ~ST_STOP;
820821        if (LOG_DMA) logerror("DMA terminated\n");
821822    }
822   
823
823824    // Interrupt if count is zero, and interrupt flag set
824825    if((dma->control & INTERRUPT_ON_ZERO) && (dma->count==0))
825826    {
826827      if (LOG_DMA>1) logerror("DMA%d - requesting interrupt: count = %04X, source = %04X\n", which, dma->count, dma->source);
827828      i186.intr.request |= 0x04 << which;
828      update_interrupt_state(machine);     
829      update_interrupt_state(machine);
829830    }
830831}
831832
r7305r7306
837838{
838839
839840    logerror("Machine reset\n");
840   
841
841842   /* create timers here so they stick around */
842843   i186.timer[0].int_timer = timer_alloc(machine, internal_timer_int, NULL);
843844   i186.timer[1].int_timer = timer_alloc(machine, internal_timer_int, NULL);
r7305r7306
861862   i186.intr.ext[2]         = 0x000f;
862863   i186.intr.ext[3]         = 0x000f;
863864    i186.intr.in_service        = 0x0000;
864   
865
865866    /* External vectors by default to internal int 0/1 vectors */
866867    i186.intr.ext_vector[0]      = 0x000C;
867868   i186.intr.ext_vector[1]      = 0x000D;
868   
869
869870    i186.intr.pending           = 0x0000;
870871   i186.intr.ack_mask          = 0x0000;
871872   i186.intr.request           = 0x0000;
872873   i186.intr.status            = 0x0000;
873874   i186.intr.poll_status       = 0x0000;
874   
875
875876    logerror("CPU reset done\n");
876877}
877878
r7305r7306
12741275MACHINE_RESET(nimbus)
12751276{
12761277   /* CPU */
1277   nimbus_cpu_reset(machine);
1278   nimbus_cpu_reset(machine);
12781279    iou_reset();
12791280    fdc_reset();
12801281    hdc_reset(machine);
r7305r7306
12931294    nimbus_cpu_init(machine);
12941295
12951296    keyboard.keyscan_timer=timer_alloc(machine, keyscan_callback, NULL);
1296   
1297
12971298   /* setup debug commands */
12981299   if (machine->debug_flags & DEBUG_FLAG_ENABLED)
12991300   {
r7305r7306
13031304
13041305        /* set up the instruction hook */
13051306        debug_cpu_set_instruction_hook(devtag_get_device(machine, MAINCPU_TAG), instruction_hook);
1306     
1307
13071308    }
1308   
1309
13091310    debug_flags=0;
13101311}
13111312
r7305r7306
13131314{
13141315    int IntNo;
13151316    int Vector;
1316   
1317
13171318    if(params>1)
1318    {   
1319    {
13191320        sscanf(param[0],"%X",&IntNo);
13201321        sscanf(param[1],"%X",&Vector);
13211322
13221323        debug_console_printf(machine,"triggering IRQ%d, Vector=%02X\n",IntNo,Vector);
1323        external_int(machine,IntNo,Vector);       
1324        external_int(machine,IntNo,Vector);
13241325    }
13251326    else
13261327    {
13271328        debug_console_printf(machine,"Error, you must supply an intno and vector to trigger\n");
13281329    }
1329   
1330   
1330
1331
13311332}
13321333
13331334
13341335static void execute_debug_intmasks(running_machine *machine, int ref, int params, const char *param[])
13351336{
13361337    int IntNo;
1337   
1338   
1338
1339
13391340    debug_console_printf(machine,"i186.intr.priority_mask=%4X\n",i186.intr.priority_mask);
13401341    for(IntNo=0; IntNo<4; IntNo++)
13411342    {
13421343        debug_console_printf(machine,"extInt%d mask=%4X\n",IntNo,i186.intr.ext[IntNo]);
13431344    }
1344   
1345
13451346    debug_console_printf(machine,"i186.intr.request   = %04X\n",i186.intr.request);
13461347    debug_console_printf(machine,"i186.intr.ack_mask  = %04X\n",i186.intr.ack_mask);
13471348    debug_console_printf(machine,"i186.intr.in_service= %04X\n",i186.intr.in_service);
r7305r7306
13501351static void nimbus_debug(running_machine *machine, int ref, int params, const char *param[])
13511352{
13521353    if(params>0)
1353    {   
1354        sscanf(param[0],"%d",&debug_flags);       
1354    {
1355        sscanf(param[0],"%d",&debug_flags);
13551356    }
13561357    else
13571358    {
r7305r7306
13681369{
13691370    const address_space *space = cpu_get_address_space(device, ADDRESS_SPACE_PROGRAM);
13701371    UINT8               *addr_ptr;
1371   
1372
13721373    addr_ptr = (UINT8*)memory_get_read_ptr(space,curpc);
1373       
1374
13741375    if ((addr_ptr !=NULL) && (addr_ptr[0]==0xCD) && (addr_ptr[1]==0xF0))
13751376        decode_subbios(device,curpc);
1376   
1377
13771378    return 0;
13781379}
13791380
r7305r7306
13861387    char    type_str[80];
13871388    char    drv_str[80];
13881389    char    func_str[80];
1389   
1390
13901391    void (*dump_dssi)(running_device *,UINT16, UINT16) = NULL;
13911392
13921393    running_device *cpu = devtag_get_device(device->machine,MAINCPU_TAG);
1393   
1394
13941395    UINT16  ax = cpu_get_reg(cpu,I8086_AX);
13951396    UINT16  bx = cpu_get_reg(cpu,I8086_BX);
13961397    UINT16  cx = cpu_get_reg(cpu,I8086_CX);
13971398    UINT16  ds = cpu_get_reg(cpu,I8086_DS);
13981399    UINT16  si = cpu_get_reg(cpu,I8086_SI);
1399   
1400
14001401    logerror("=======================================================================\n");
14011402    logerror("Sub-bios call at %08X, AX=%04X, BX=%04X, CX=%04X, DS:SI=%04X:%04X\n",pc,ax,bx,cx,ds,si);
14021403
14031404    set_type("invalid");
14041405    set_drv("invalid");
14051406    set_func("invalid");
1406   
14071407
1408
14081409    switch (cx)
14091410    {
1410        case 0   :
1411        case 0   :
14111412        {
14121413            set_type("t_mummu");
14131414            set_drv("d_mummu");
1414           
1415
14151416            switch (ax)
14161417            {
14171418                case 0  : set_func("f_get_version_number"); break;
r7305r7306
14241425                case 7  : set_func("f_get_copyright"); break;
14251426            }
14261427        }; break;
1427       
1428        case 1   :
1428
1429        case 1   :
14291430        {
14301431            set_type("t_character");
14311432            set_drv("d_printer");
1432           
1433
14331434            switch(ax)
14341435            {
14351436                case 0  : set_func("f_get_version_number"); break;
r7305r7306
14431444                case 8  : set_func("f_set_IO_parameters"); break;
14441445            }
14451446        }; break;
1446       
1447        case 2   :
1447
1448        case 2   :
14481449        {
14491450            set_type("t_disk");
1450           
1451
14511452            switch(bx)
14521453            {
14531454                case 0  : set_drv("d_floppy"); break;
r7305r7306
14561457                case 3  : set_drv("d_rompack"); break;
14571458                case 4  : set_drv("d_eeprom"); break;
14581459            }
1459           
1460
14601461            switch(ax)
14611462            {
1462                case 0  : set_func("f_get_version_number"); break;           
1463                case 0  : set_func("f_get_version_number"); break;
14631464                case 1  : set_func("f_initialise_unit"); break;
14641465                case 2  : set_func("f_pseudo_init_unit"); break;
14651466                case 3  : set_func("f_get_device_status"); break;
r7305r7306
14701471                case 8  : set_func("f_recalibrate"); break;
14711472                case 9  : set_func("f_motors_off"); break;
14721473            }
1473           
1474
14741475        }; break;
1475       
1476        case 3   :
1476
1477        case 3   :
14771478        {
14781479            set_type("t_piconet");
14791480            set_drv("d_piconet");
1480           
1481
14811482            switch(ax)
14821483            {
1483                case 0  : set_func("f_get_version_number"); break;
1484                case 0  : set_func("f_get_version_number"); break;
14841485                case 1  : set_func("f_get_slave_status"); break;
14851486                case 2  : set_func("f_get_slave_map"); break;
14861487                case 3  : set_func("f_change_slave_addr"); break;
r7305r7306
14911492                case 8  : set_func("f_send_data_block"); break;
14921493                case 9  : set_func("f_request_data_block"); break;
14931494                case 10 : set_func("f_reset_slave"); break;
1494           
1495
14951496            }
14961497        }; break;
1497       
1498        case 4   :
1498
1499        case 4   :
14991500        {
15001501            set_type("t_tick");
15011502            set_drv("d_tick");
1502           
1503
15031504            switch(ax)
15041505            {
1505                case 0  : set_func("f_get_version_number"); break;
1506                case 1  : set_func("f_ticks_per_second"); break;
1507                case 2  : set_func("f_link_tick_routine"); break;
1508                case 3  : set_func("f_unlink_tick_routine"); break;           
1506                case 0  : set_func("f_get_version_number"); break;
1507                case 1  : set_func("f_ticks_per_second"); break;
1508                case 2  : set_func("f_link_tick_routine"); break;
1509                case 3  : set_func("f_unlink_tick_routine"); break;
15091510            }
15101511        }; break;
1511       
1512        case 5   :
1512
1513        case 5   :
15131514        {
15141515            set_type("t_graphics_input");
15151516
15161517            switch(bx)
15171518            {
1518                case 0  : set_drv("d_mouse"); break;
1519                case 1  : set_drv("d_joystick_1"); break;
1520                case 2  : set_drv("d_joystick_2"); break;
1519                case 0  : set_drv("d_mouse"); break;
1520                case 1  : set_drv("d_joystick_1"); break;
1521                case 2  : set_drv("d_joystick_2"); break;
15211522            }
1522           
1523           
1523
1524
15241525            switch(ax)
15251526            {
1526                case 0  : set_func("f_get_version_number"); break;           
1527                case 1  : set_func("f_graphics_input_cold_start"); break;   
1528                case 2  : set_func("f_graphics_input_device_off"); break;   
1529                case 3  : set_func("f_return_button_status"); break;     
1530                case 4  : set_func("f_return_switch_and_button_stat"); break;   
1527                case 0  : set_func("f_get_version_number"); break;
1528                case 1  : set_func("f_graphics_input_cold_start"); break;
1529                case 2  : set_func("f_graphics_input_device_off"); break;
1530                case 3  : set_func("f_return_button_status"); break;
1531                case 4  : set_func("f_return_switch_and_button_stat"); break;
15311532                case 5  : set_func("f_start_tracking"); break;
15321533                case 6  : set_func("f_stop_tracking"); break;
15331534                case 7  : set_func("f_enquire_position"); break;
r7305r7306
15391540                case 13 : set_func("f_enquire_graphics_in_misc_data"); break;
15401541            }
15411542        }; break;
1542       
1543        case 6   :
1543
1544        case 6   :
15441545        {
15451546            set_type("t_graphics_output");
15461547            set_drv("d_ngc_screen");
15471548
15481549            switch(ax)
15491550            {
1550                case 0  : set_func("f_get_version_number");                 break;
1551                case 1  : set_func("f_graphics_output_cold_start");         break;
1552                case 2  : set_func("f_graphics_output_warm_start");         break;
1553                case 3  : set_func("f_graphics_output_off");                break;
1554                case 4  : set_func("f_reinit_graphics_output");             break;
1555                case 5  : set_func("f_polymarker");                         break;
1556                case 6  : set_func("f_polyline"); dump_dssi=&decode_dssi_f_fill_area;   break;
1557                case 7  : set_func("f_fill_area"); dump_dssi=&decode_dssi_f_fill_area; break;
1558                case 8  : set_func("f_flood_fill_area"); break;
1559                case 9  : set_func("f_plot_character_string"); dump_dssi=&decode_dssi_f_plot_character_string; break;
1560                case 10 : set_func("f_define_graphics_clipping_area"); break;
1561                case 11 : set_func("f_enquire_clipping_area_limits"); break;
1562                case 12 : set_func("f_select_graphics_clipping_area"); break;
1563                case 13 : set_func("f_enq_selctd_graphics_clip_area"); break;
1564                case 14 : set_func("f_set_clt_element"); break;
1565                case 15 : set_func("f_enquire_clt_element"); break;
1566                case 16 : set_func("f_set_new_clt"); dump_dssi=&decode_dssi_f_set_new_clt; break;
1567                case 17 : set_func("f_enquire_clt_contents"); break;
1568                case 18 : set_func("f_define_dithering_pattern"); break;
1569                case 19 : set_func("f_enquire_dithering_pattern"); break;
1570                case 20 : set_func("f_draw_sprite"); break;
1571                case 21 : set_func("f_move_sprite"); break;
1572                case 22 : set_func("f_erase_sprite"); break;
1573                case 23 : set_func("f_read_pixel"); break;
1574                case 24 : set_func("f_read_to_limit"); break;
1575                case 25 : set_func("f_read_area_pixel"); break;
1576                case 26 : set_func("f_write_area_pixel"); break;
1577                case 27 : set_func("f_copy_area_pixel"); break;
1551                case 0  : set_func("f_get_version_number");                 break;
1552                case 1  : set_func("f_graphics_output_cold_start");         break;
1553                case 2  : set_func("f_graphics_output_warm_start");         break;
1554                case 3  : set_func("f_graphics_output_off");                break;
1555                case 4  : set_func("f_reinit_graphics_output");             break;
1556                case 5  : set_func("f_polymarker");                         break;
1557                case 6  : set_func("f_polyline"); dump_dssi=&decode_dssi_f_fill_area;   break;
1558                case 7  : set_func("f_fill_area"); dump_dssi=&decode_dssi_f_fill_area; break;
1559                case 8  : set_func("f_flood_fill_area"); break;
1560                case 9  : set_func("f_plot_character_string"); dump_dssi=&decode_dssi_f_plot_character_string; break;
1561                case 10 : set_func("f_define_graphics_clipping_area"); break;
1562                case 11 : set_func("f_enquire_clipping_area_limits"); break;
1563                case 12 : set_func("f_select_graphics_clipping_area"); break;
1564                case 13 : set_func("f_enq_selctd_graphics_clip_area"); break;
1565                case 14 : set_func("f_set_clt_element"); break;
1566                case 15 : set_func("f_enquire_clt_element"); break;
1567                case 16 : set_func("f_set_new_clt"); dump_dssi=&decode_dssi_f_set_new_clt; break;
1568                case 17 : set_func("f_enquire_clt_contents"); break;
1569                case 18 : set_func("f_define_dithering_pattern"); break;
1570                case 19 : set_func("f_enquire_dithering_pattern"); break;
1571                case 20 : set_func("f_draw_sprite"); break;
1572                case 21 : set_func("f_move_sprite"); break;
1573                case 22 : set_func("f_erase_sprite"); break;
1574                case 23 : set_func("f_read_pixel"); break;
1575                case 24 : set_func("f_read_to_limit"); break;
1576                case 25 : set_func("f_read_area_pixel"); break;
1577                case 26 : set_func("f_write_area_pixel"); break;
1578                case 27 : set_func("f_copy_area_pixel"); break;
15781579
1579                case 29 : set_func("f_read_area_word"); break;
1580                case 30 : set_func("f_write_area_word"); break;
1581                case 31 : set_func("f_copy_area_word"); break;
1582                case 32 : set_func("f_swap_area_word"); break;
1583                case 33 : set_func("f_set_border_colour"); break;
1584                case 34 : set_func("f_enquire_border_colour"); break;
1585                case 35 : set_func("f_enquire_miscellaneous_data"); break;
1586                case 36  : set_func("f_circle"); break;
1580                case 29 : set_func("f_read_area_word"); break;
1581                case 30 : set_func("f_write_area_word"); break;
1582                case 31 : set_func("f_copy_area_word"); break;
1583                case 32 : set_func("f_swap_area_word"); break;
1584                case 33 : set_func("f_set_border_colour"); break;
1585                case 34 : set_func("f_enquire_border_colour"); break;
1586                case 35 : set_func("f_enquire_miscellaneous_data"); break;
1587                case 36  : set_func("f_circle"); break;
15871588
1588                case 38 : set_func("f_arc_of_ellipse"); break;
1589                case 39 : set_func("f_isin"); break;
1590                case 40 : set_func("f_icos"); break;
1591                case 41 : set_func("f_define_hatching_pattern"); break;
1592                case 42 : set_func("f_enquire_hatching_pattern"); break;
1593                case 43 : set_func("f_enquire_display_line"); break;
1594                case 44 : set_func("f_plonk_logo"); break;
1589                case 38 : set_func("f_arc_of_ellipse"); break;
1590                case 39 : set_func("f_isin"); break;
1591                case 40 : set_func("f_icos"); break;
1592                case 41 : set_func("f_define_hatching_pattern"); break;
1593                case 42 : set_func("f_enquire_hatching_pattern"); break;
1594                case 43 : set_func("f_enquire_display_line"); break;
1595                case 44 : set_func("f_plonk_logo"); break;
15951596            }
15961597        }; break;
1597       
1598        case 7   :
1598
1599        case 7   :
15991600        {
16001601            set_type("t_zend");
16011602            switch(ax)
16021603            {
1603                case 0  : set_func("f_get_version_number"); break;           
1604                case 0  : set_func("f_get_version_number"); break;
16041605            }
16051606        }; break;
1606       
1607        case 8   :
1607
1608        case 8   :
16081609        {
16091610            set_type("t_zep");
16101611            switch(ax)
16111612            {
1612                case 0  : set_func("f_get_version_number"); break;           
1613                case 0  : set_func("f_get_version_number"); break;
16131614            }
16141615        }; break;
1615       
1616        case 9   :
1616
1617        case 9   :
16171618        {
16181619            set_type("t_raw_console");
1619           
1620
16201621            switch(bx)
16211622            {
1622                case 0  :
1623                case 0  :
16231624                {
16241625                    set_drv("d_screen");
1625           
1626
16261627                    switch(ax)
16271628                    {
1628                        case 0  : set_func("f_get_version_number"); break;           
1629                        case 0  : set_func("f_get_version_number"); break;
16291630                        case 1  : set_func("f_plonk_char"); dump_dssi=decode_dssi_f_plonk_char; break;
16301631                        case 2  : set_func("f_plonk_cursor"); break;
16311632                        case 3  : set_func("f_kill_cursor"); break;
r7305r7306
16381639                        case 10 : set_func("f_set_cursor_flash_rate"); break;
16391640                    }
16401641                }; break;
1641           
1642
16421643                case 1  :
16431644                {
16441645                    set_drv("d_keyboard");
1645                   
1646
16461647                    switch(ax)
16471648                    {
1648                        case 0  : set_func("f_get_version_number"); break;           
1649                        case 0  : set_func("f_get_version_number"); break;
16491650                        case 1  : set_func("f_init_keyboard"); break;
16501651                        case 2  : set_func("f_get_last_key_code"); break;
16511652                        case 3  : set_func("f_get_bitmap"); break;
r7305r7306
16531654                }; break;
16541655            }
16551656        }; break;
1656       
1657        case 10   :
1657
1658        case 10   :
16581659        {
16591660
16601661            set_type("t_acoustics");
1661                       
1662
16621663            switch(bx)
16631664            {
1664                case 0  :
1665                case 0  :
16651666                {
16661667                    set_drv("d_sound");
1667           
1668
16681669                    switch(ax)
16691670                    {
1670                        case 0  : set_func("f_get_version_number"); break;           
1671                        case 0  : set_func("f_get_version_number"); break;
16711672                        case 1  : set_func("f_sound_enable"); break;
16721673                        case 2  : set_func("f_play_note"); break;
16731674                        case 3  : set_func("f_get_queue_status"); break;
16741675                    }
16751676                }; break;
1676           
1677
16771678                case 1  :
16781679                {
16791680                    set_drv("d_voice");
16801681
16811682                    switch(ax)
16821683                    {
1683                        case 0  : set_func("f_get_version_number"); break;           
1684                        case 0  : set_func("f_get_version_number"); break;
16841685                        case 1  : set_func("f_talk"); break;
16851686                        case 2  : set_func("f_wait_and_talk"); break;
16861687                        case 3  : set_func("f_test_talking"); break;
16871688                    }
16881689                }
1689            }   
1690            }
16901691        }; break;
1691       
1692        case 11   :
1692
1693        case 11   :
16931694        {
16941695            set_type("t_hard_sums");
16951696            switch(ax)
16961697            {
1697                case 0  : set_func("f_get_version_number"); break;           
1698                case 0  : set_func("f_get_version_number"); break;
16981699            }
1699        }; break;   
1700        }; break;
17001701    }
1701   
1702
17021703    logerror("Type=%s, Driver=%s, Function=%s\n",type_str,drv_str,func_str);
1703   
1704
17041705    if(dump_dssi!=NULL)
17051706        dump_dssi(device,ds,si);
17061707    logerror("=======================================================================\n");
r7305r7306
17191720static void decode_dssi_f_fill_area(running_device *device,UINT16  ds, UINT16 si)
17201721{
17211722    const address_space *space = cputag_get_address_space(device->machine,MAINCPU_TAG, ADDRESS_SPACE_PROGRAM);
1722
1723
17231724    UINT16          *addr_ptr;
17241725    t_area_params   *area_params;
17251726    t_nimbus_brush  *brush;
17261727    int             cocount;
17271728
17281729    area_params = (t_area_params   *)get_dssi_ptr(space,ds,si);
1729   
1730
17301731    OUTPUT_SEGOFS("SegBrush:OfsBrush",area_params->seg_brush,area_params->ofs_brush);
17311732    brush=(t_nimbus_brush  *)memory_get_read_ptr(space, LINEAR_ADDR(area_params->seg_brush,area_params->ofs_brush));
1732   
1733
17331734    logerror("Brush params\n");
17341735    logerror("Style=%04X,          StyleIndex=%04X\n",brush->style,brush->style_index);
17351736    logerror("Colour1=%04X,        Colour2=%04X\n",brush->colour1,brush->colour2);
17361737    logerror("transparency=%04X,   boundry_spec=%04X\n",brush->transparency,brush->boundary_spec);
17371738    logerror("boundry colour=%04X, save colour=%04X\n",brush->boundary_colour,brush->save_colour);
1738           
1739   
1739
1740
17401741    OUTPUT_SEGOFS("SegData:OfsData",area_params->seg_data,area_params->ofs_data);
1741   
1742
17421743    addr_ptr = (UINT16 *)memory_get_read_ptr(space, LINEAR_ADDR(area_params->seg_data,area_params->ofs_data));
17431744    for(cocount=0; cocount < area_params->count; cocount++)
17441745    {
r7305r7306
17491750static void decode_dssi_f_plot_character_string(running_device *device,UINT16  ds, UINT16 si)
17501751{
17511752    const address_space *space = cputag_get_address_space(device->machine,MAINCPU_TAG, ADDRESS_SPACE_PROGRAM);
1752
1753
17531754    UINT8          *char_ptr;
17541755    t_plot_string_params   *plot_string_params;
17551756    int             charno;
1756       
1757
17571758    plot_string_params=(t_plot_string_params   *)get_dssi_ptr(space,ds,si);
1758   
1759
17591760    OUTPUT_SEGOFS("SegFont:OfsFont",plot_string_params->seg_font,plot_string_params->ofs_font);
17601761    OUTPUT_SEGOFS("SegData:OfsData",plot_string_params->seg_data,plot_string_params->ofs_data);
1761   
1762
17621763    logerror("x=%d, y=%d, length=%d\n",plot_string_params->x,plot_string_params->y,plot_string_params->length);
1763   
1764
17641765    char_ptr=(UINT8*)memory_get_read_ptr(space, LINEAR_ADDR(plot_string_params->seg_data,plot_string_params->ofs_data));
17651766
17661767    if (plot_string_params->length==0xFFFF)
r7305r7306
17681769    else
17691770        for(charno=0;charno<plot_string_params->length;charno++)
17701771            logerror("%c",char_ptr[charno]);
1771       
1772
17721773    logerror("\n");
17731774}
17741775
r7305r7306
17781779    UINT16  *new_colours;
17791780    int     colour;
17801781    new_colours=(UINT16  *)get_dssi_ptr(space,ds,si);
1781   
1782
17821783    OUTPUT_SEGOFS("SegColours:OfsColours",ds,si);
1783   
1784
17841785    for(colour=0;colour<16;colour++)
17851786        logerror("colour #%02X=%04X\n",colour,new_colours[colour]);
1786   
1787
17871788}
17881789
17891790static void decode_dssi_f_plonk_char(running_device *device,UINT16  ds, UINT16 si)
r7305r7306
17911792    const address_space *space = cputag_get_address_space(device->machine,MAINCPU_TAG, ADDRESS_SPACE_PROGRAM);
17921793    UINT16  *params;
17931794    params=(UINT16  *)get_dssi_ptr(space,ds,si);
1794   
1795
17951796    OUTPUT_SEGOFS("SegParams:OfsParams",ds,si);
17961797
17971798    logerror("plonked_char=%c\n",params[0]);
r7305r7306
18021803    const address_space *space = cputag_get_address_space(device->machine,MAINCPU_TAG, ADDRESS_SPACE_PROGRAM);
18031804    UINT16  *params;
18041805    int     param_no;
1805   
1806
18061807    params=(UINT16  *)get_dssi_ptr(space,ds,si);
1807   
1808
18081809    for(param_no=0;param_no<16;param_no++)
18091810        logerror("%04X ",params[param_no]);
1810       
1811
18111812    logerror("\n");
18121813}
18131814
18141815READ16_HANDLER( nimbus_io_r )
18151816{
18161817    int pc=cpu_get_pc(space->cpu);
1817   
1818
18181819    logerror("Nimbus IOR at pc=%08X from %04X mask=%04X, data=%04X\n",pc,(offset*2)+0x30,mem_mask,IOPorts[offset]);
1819   
1820
18201821    switch (offset*2)
18211822    {
18221823        default         : return IOPorts[offset]; break;
r7305r7306
18291830    int pc=cpu_get_pc(space->cpu);
18301831
18311832    logerror("Nimbus IOW at %08X write of %04X to %04X mask=%04X\n",pc,data,(offset*2)+0x30,mem_mask);
1832   
1833
18331834    switch (offset*2)
18341835    {
18351836        default         : COMBINE_DATA(&IOPorts[offset]); break;
r7305r7306
18371838}
18381839
18391840
1840/*
1841    Keyboard emulation
1842   
1841/*
1842    Keyboard emulation
1843
18431844*/
18441845
18451846static void keyboard_reset(void)
18461847{
18471848    memset(keyboard.keyrows,0xFF,NIMBUS_KEYROWS);
1848   
1849
18491850    // Setup timer to scan keyboard.
18501851    timer_adjust_periodic(keyboard.keyscan_timer, attotime_zero, 0, ATTOTIME_IN_HZ(50));
18511852
r7305r7306
18821883    UINT8   mask;
18831884    static const char *const keynames[] = {
18841885        "KEY0", "KEY1", "KEY2", "KEY3", "KEY4",
1885        "KEY5", "KEY6", "KEY7", "KEY8", "KEY9",
1886        "KEY5", "KEY6", "KEY7", "KEY8", "KEY9",
18861887        "KEY10"
18871888    };
18881889
18891890    for(row=0;row<NIMBUS_KEYROWS;row++)
18901891    {
18911892        keyrow=input_port_read(machine, keynames[row]);
1892       
1893
18931894        for(mask=0x80, bitno=7;mask>0;mask=mask>>1, bitno-=1)
18941895        {
18951896            if(!(keyrow & mask) && (keyboard.keyrows[row] & mask))
r7305r7306
18971898                if (LOG_KEYBOARD) logerror("keypress %02X\n",(row<<3)+bitno);
18981899                queue_scancode((row<<3)+bitno);
18991900            }
1900   
1901
19011902            if((keyrow & mask) && !(keyboard.keyrows[row] & mask))
19021903            {
1903                if (LOG_KEYBOARD) logerror("keyrelease %02X\n",0x80+(row<<3)+bitno); 
1904                if (LOG_KEYBOARD) logerror("keyrelease %02X\n",0x80+(row<<3)+bitno);
19041905                queue_scancode(0x80+(row<<3)+bitno);
19051906            }
19061907        }
1907       
1908
19081909        keyboard.keyrows[row]=keyrow;
19091910    }
19101911}
19111912
19121913
1913/*
1914/*
19141915
1915Z80SIO, used for the keyboard interface
1916Z80SIO, used for the keyboard interface
19161917
19171918*/
19181919
r7305r7306
19201921{
19211922    int pc=cpu_get_pc(devtag_get_device(device->machine,MAINCPU_TAG));
19221923    UINT8 result = 0;
1923   
1924
19241925   switch (offset*2)
19251926   {
19261927        case 0 :
1927            result=z80sio_d_r(device, 0);
1928            result=z80sio_d_r(device, 0);
19281929            break;
19291930        case 2 :
1930            result=z80sio_d_r(device, 1);
1931            result=z80sio_d_r(device, 1);
19311932            break;
19321933        case 4 :
19331934            result=z80sio_c_r(device, 0);
r7305r7306
19781979    if(state!=sio_int_state)
19791980    {
19801981        sio_int_state=state;
1981       
1982
19821983        if(state)
19831984            external_int(device->machine,0,EXTERNAL_INT_Z80SIO);
19841985    }
r7305r7306
19992000{
20002001   if(channel==0)
20012002    {
2002        return keyboard_queue_read();     
2003        return keyboard_queue_read();
20032004    }
20042005    else
20052006        return -1;
r7305r7306
20222023    if(iou_reg092 & DISK_INT_ENABLE)
20232024    {
20242025        external_int(machine,0,EXTERNAL_INT_DISK);
2025    }
2026    }
20262027}
20272028
20282029static WRITE_LINE_DEVICE_HANDLER( nimbus_fdc_intrq_w )
r7305r7306
20362037
20372038    if(LOG_DISK)
20382039        logerror("nimbus_drives_drq_w(%d)\n", state);
2039   
2040
20402041    if(state && FDC_DRQ_ENABLED())
20412042        drq_callback(device->machine,1);
20422043}
20432044
2044/*
2045    0x410 read bits
2046 
2045/*
2046    0x410 read bits
2047
20472048    0   Ready from floppy
20482049    1   Index pulse from floppy
20492050    2   Motor on from floppy
r7305r7306
20592060      int result = 0;
20602061   running_device *fdc = devtag_get_device(space->machine, FDC_TAG);
20612062    running_device *hdc = devtag_get_device(space->machine, SCSIBUS_TAG);
2062   
2063
20632064    int pc=cpu_get_pc(space->cpu);
20642065    running_device *drive = devtag_get_device(space->machine, nimbus_wd17xx_interface.floppy_drive_tags[FDC_DRIVE()]);
2065   
2066
20662067    switch(offset*2)
20672068   {
20682069      case 0x08 :
r7305r7306
20822083            nimbus_drives.reg410_in &= ~FDC_BITS_410;
20832084            nimbus_drives.reg410_in |= (FDC_MOTOR() ? FDC_MOTOR_MASKI : 0x00);
20842085            nimbus_drives.reg410_in |= (floppy_drive_get_flag_state(drive, FLOPPY_DRIVE_INDEX) ? 0x00 : FDC_INDEX_MASK);
2085            nimbus_drives.reg410_in |= (floppy_drive_get_flag_state(drive, FLOPPY_DRIVE_READY) ? FDC_READY_MASK : 0x00);     
2086           
2086            nimbus_drives.reg410_in |= (floppy_drive_get_flag_state(drive, FLOPPY_DRIVE_READY) ? FDC_READY_MASK : 0x00);
2087
20872088            // Flip inverted bits
20882089            result=nimbus_drives.reg410_in ^ INV_BITS_410;
20892090            break;
r7305r7306
20992100
21002101    if((LOG_DISK_HDD) && ((offset*2)>=0x10))
21012102        logerror("Nimbus HDCR at pc=%08X from %04X data=%02X\n",pc,(offset*2)+0x400,result);
2102   
21032103
2104
21042105   return result;
21052106}
21062107
21072108/*
21082109    0x400 write bits
2109   
2110
21102111    0   drive 0 select
21112112    1   drive 1 select
21122113    2   drive 2 select
r7305r7306
21152116    5   fdc motor on
21162117    6   hdc drq enabled
21172118    7   fdc drq enabled
2118   
2119
21192120    0x410 write bits
2120   
2121
21212122    0   SCSI reset
21222123    1   SCSI SEL
2123    2   SCSI IRQ Enable
2124    2   SCSI IRQ Enable
21242125*/
21252126
21262127WRITE8_HANDLER( nimbus_disk_w )
r7305r7306
21292130    running_device *hdc = devtag_get_device(space->machine, SCSIBUS_TAG);
21302131    int                 pc=cpu_get_pc(space->cpu);
21312132    UINT8               reg400_old = nimbus_drives.reg400;
2132   
2133
21332134    if(LOG_DISK_FDD && ((offset*2)<=0x10))
21342135        logerror("Nimbus FDCW at %05X write of %02X to %04X\n",pc,data,(offset*2)+0x400);
21352136
r7305r7306
21402141   {
21412142        case 0x00 :
21422143            nimbus_drives.reg400=data;
2143         
2144
21442145            wd17xx_set_drive(fdc,FDC_DRIVE());
21452146            wd17xx_set_side(fdc, FDC_SIDE());
2146           
2147            // Nimbus FDC is hard wired for double density
2148            wd17xx_set_density(fdc, DEN_MFM_LO);
21492147
21502148            // if we enable hdc drq with a pending condition, act on it
21512149            if((data & HDC_DRQ_MASK) && (~reg400_old & HDC_DRQ_MASK))
r7305r7306
21672165        case 0x10 :
21682166            hdc_ctrl_write(space->machine,data);
21692167            break;
2170   
2168
21712169        case 0x18 :
21722170            scsi_data_w(hdc, data);
21732171            hdc_post_rw(space->machine);
r7305r7306
21872185    nimbus_drives.reg410_in |= (get_scsi_line(hdc,SCSI_LINE_IO)  ? HDC_IO_MASK  : 0);
21882186    nimbus_drives.reg410_in |= (get_scsi_line(hdc,SCSI_LINE_BSY) ? HDC_BSY_MASK : 0);
21892187    nimbus_drives.reg410_in |= (get_scsi_line(hdc,SCSI_LINE_MSG) ? HDC_MSG_MASK : 0);
2190   
2188
21912189    nimbus_drives.drq_ff=0;
21922190}
21932191
21942192static void hdc_ctrl_write(running_machine *machine, UINT8 data)
21952193{
21962194   running_device *hdc = devtag_get_device(machine, SCSIBUS_TAG);
2197   
2195
21982196    // If we enable the HDC interupt, and an interrupt is pending, go deal with it.
2199    if(((data & HDC_IRQ_MASK) && (~nimbus_drives.reg410_out & HDC_IRQ_MASK)) &&
2197    if(((data & HDC_IRQ_MASK) && (~nimbus_drives.reg410_out & HDC_IRQ_MASK)) &&
22002198       ((~nimbus_drives.reg410_in & HDC_INT_TRIGGER)==HDC_INT_TRIGGER))
22012199        generate_disk_int(machine);
2202           
2200
22032201    nimbus_drives.reg410_out=data;
22042202
22052203    set_scsi_line(hdc, SCSI_LINE_RESET, (data & HDC_RESET_MASK) ? 0 : 1);
r7305r7306
22092207static void hdc_post_rw(running_machine *machine)
22102208{
22112209    running_device *hdc = devtag_get_device(machine, SCSIBUS_TAG);
2212   
2210
22132211    if((nimbus_drives.reg410_in & HDC_REQ_MASK)==0)
22142212        set_scsi_line(hdc,SCSI_LINE_ACK,0);
22152213
r7305r7306
22282226{
22292227    UINT8   mask = 0;
22302228    UINT8   last = 0;
2231   
2229
22322230    switch (line)
22332231    {
22342232        case SCSI_LINE_REQ   : mask=HDC_REQ_MASK; break;
r7305r7306
22372235        case SCSI_LINE_BSY   : mask=HDC_BSY_MASK; break;
22382236        case SCSI_LINE_MSG   : mask=HDC_MSG_MASK; break;
22392237    }
2240   
2238
22412239    last=nimbus_drives.reg410_in & mask;
2242   
2240
22432241    if(state)
22442242        nimbus_drives.reg410_in|=mask;
22452243    else
22462244        nimbus_drives.reg410_in&=~mask;
22472245
2248   
2249    if(line==SCSI_LINE_REQ)
2246
2247    if(line==SCSI_LINE_REQ)
22502248    {
22512249        if (state==0)
22522250        {
22532251            if(HDC_IRQ_ENABLED() && ((~nimbus_drives.reg410_in & HDC_INT_TRIGGER)==HDC_INT_TRIGGER))
2254                generate_disk_int(device->machine);
2255   
2252                generate_disk_int(device->machine);
2253
22562254            if(((nimbus_drives.reg410_in & HDC_CD_MASK)==HDC_CD_MASK) && (last!=0))
2257            {   
2255            {
22582256                nimbus_drives.drq_ff=1;
22592257                hdc_drq(device->machine);
22602258            }
r7305r7306
22712269    running_device *er59256 = machine->device(ER59256_TAG);
22722270
22732271    logerror("peripheral controler reset\n");
2274   
2272
22752273    memset(&ipc_interface,0,sizeof(ipc_interface));
2276   
2274
22772275    if(!data_loaded(er59256))
22782276        preload_rom(er59256,def_config,ARRAY_LENGTH(def_config));
22792277}
r7305r7306
22852283    logerror("in_data=%02X, in_status=%02X, out_data=%02X, out_status=%02X\n",
22862284              ipc_interface.ipc_in, ipc_interface.status_in,
22872285              ipc_interface.ipc_out, ipc_interface.status_out);
2288             
2286
22892287}
22902288#endif
22912289
2292READ8_HANDLER( pc8031_r )
2290READ8_HANDLER( pc8031_r )
22932291{
22942292   int pc=cpu_get_pc(space->cpu);
22952293    UINT8   result;
2296
2294
22972295    switch(offset*2)
22982296    {
2299        case 0x00   : result=ipc_interface.ipc_out; 
2300                      ipc_interface.status_in   &= ~IPC_IN_READ_PEND;
2301                      ipc_interface.status_out  &= ~IPC_OUT_BYTE_AVAIL;
2297        case 0x00   : result=ipc_interface.ipc_out;
2298                      ipc_interface.status_in   &= ~IPC_IN_READ_PEND;
2299                      ipc_interface.status_out  &= ~IPC_OUT_BYTE_AVAIL;
23022300                      break;
2303                     
2301
23042302        case 0x02   : result=ipc_interface.status_out;
23052303                      break;
2306                     
2304
23072305        default : result=0; break;
23082306    }
23092307
23102308    if(LOG_PC8031_186)
23112309        logerror("Nimbus PCIOR %08X read of %04X returns %02X\n",pc,(offset*2)+0xC0,result);
2312       
2310
23132311    return result;
23142312}
23152313
r7305r7306
23242322                      ipc_interface.status_in   &= ~IPC_IN_ADDR;
23252323                      ipc_interface.status_out  |= IPC_OUT_READ_PEND;
23262324                      break;
2327                     
2325
23282326        case 0x02   : ipc_interface.ipc_in=data;
23292327                      ipc_interface.status_in   |= IPC_IN_BYTE_AVAIL;
23302328                      ipc_interface.status_in   |= IPC_IN_ADDR;
r7305r7306
23432341{
23442342   int pc=cpu_get_pc(space->cpu);
23452343    UINT8   result = 0;
2346   
2344
23472345    switch (offset & 0x01)
23482346    {
23492347        case 0x00   : result=ipc_interface.ipc_in;
2350                      ipc_interface.status_out  &= ~IPC_OUT_READ_PEND;
2351                      ipc_interface.status_in   &= ~IPC_IN_BYTE_AVAIL;
2348                      ipc_interface.status_out  &= ~IPC_OUT_READ_PEND;
2349                      ipc_interface.status_in   &= ~IPC_IN_BYTE_AVAIL;
23522350                      break;
2353                     
2351
23542352        case 0x01   : result=ipc_interface.status_in;
23552353                      break;
23562354    }
2357                       
2358    if(((offset==2) || (offset==3)) && (iou_reg092 & PC8031_INT_ENABLE))
2355
2356    if(((offset==2) || (offset==3)) && (iou_reg092 & PC8031_INT_ENABLE))
23592357        external_int(space->machine,0,EXTERNAL_INT_PC8031_8C);
2360   
2358
23612359    if(LOG_PC8031)
2362        logerror("8031: PCIOR %04X read of %04X returns %02X\n",pc,offset,result);
2363       
2360        logerror("8031: PCIOR %04X read of %04X returns %02X\n",pc,offset,result);
2361
23642362    return result;
23652363}
23662364
23672365WRITE8_HANDLER( pc8031_iou_w )
23682366{
2369   int pc=cpu_get_pc(space->cpu); 
2367   int pc=cpu_get_pc(space->cpu);
23702368
23712369    if(LOG_PC8031)
23722370        logerror("8031 PCIOW %04X write of %02X to %04X\n",pc,data,offset);
2373   
2371
23742372    switch(offset & 0x03)
23752373    {
23762374        case 0x00   : ipc_interface.ipc_out=data;
r7305r7306
23782376                      ipc_interface.status_out  &= ~IPC_OUT_ADDR;
23792377                      ipc_interface.status_in   |= IPC_IN_READ_PEND;
23802378                      break;
2381                     
2379
23822380        case 0x01   : ipc_interface.ipc_out=data;
23832381                      ipc_interface.status_out   |= IPC_OUT_BYTE_AVAIL;
23842382                      ipc_interface.status_out   |= IPC_OUT_ADDR;
r7305r7306
23902388                      ipc_interface.status_out  &= ~IPC_OUT_ADDR;
23912389                      ipc_interface.status_in   |= IPC_IN_READ_PEND;
23922390                      if(iou_reg092 & PC8031_INT_ENABLE)
2393                        external_int(space->machine,0,EXTERNAL_INT_PC8031_8F); 
2391                        external_int(space->machine,0,EXTERNAL_INT_PC8031_8F);
23942392                      break;
2395                     
2393
23962394        case 0x03   : ipc_interface.ipc_out=data;
23972395                      //ipc_interface.status_out   |= IPC_OUT_BYTE_AVAIL;
23982396                      ipc_interface.status_out   |= IPC_OUT_ADDR;
23992397                      ipc_interface.status_in    |= IPC_IN_READ_PEND;
24002398                      if(iou_reg092 & PC8031_INT_ENABLE)
2401                        external_int(space->machine,0,EXTERNAL_INT_PC8031_8E); 
2399                        external_int(space->machine,0,EXTERNAL_INT_PC8031_8E);
24022400                      break;
24032401    }
24042402}
r7305r7306
24102408    UINT8   result = 0;
24112409
24122410    if(LOG_PC8031_PORT)
2413        logerror("8031: PCPORTR %04X read of %04X returns %02X\n",pc,offset,result);
2411        logerror("8031: PCPORTR %04X read of %04X returns %02X\n",pc,offset,result);
24142412
24152413    switch(offset)
24162414    {
r7305r7306
24492447
24502448    if(LOG_IOU)
24512449        logerror("Nimbus IOUR %08X read of %04X returns %02X\n",pc,(offset*2)+0x92,result);
2452       
2450
24532451    return result;
24542452}
24552453
r7305r7306
24732471    iou_reg092=0x00;
24742472}
24752473
2476/*
2474/*
24772475    Sound hardware : AY8910
2478 
2476
24792477    I believe that the IO ports of the 8910 are used to control the ROMPack ports, however
24802478    this is currently un-implemented (and may never be as I don't have any rompacks!).
2481   
2479
24822480    The registers are mapped as so :
2483   
2481
24842482    Address     0xE0                0xE2
24852483    Read        Data                ????
24862484    Write       Register Address    Data
2487 
2488*/   
24892485
2486*/
2487
24902488static void sound_reset(running_machine *machine)
24912489{
24922490    //running_device *ay8910 = devtag_get_device(machine, AY8910_TAG);
r7305r7306
25032501{
25042502   running_device *ay8910 = devtag_get_device(space->machine, AY8910_TAG);
25052503    UINT8   result=0;
2506   
2504
25072505    if ((offset*2)==0)
25082506        result=ay8910_r(ay8910,0);
2509       
2507
25102508    return result;
25112509}
25122510
r7305r7306
25142512{
25152513   int pc=cpu_get_pc(space->cpu);
25162514   running_device *ay8910 = devtag_get_device(space->machine, AY8910_TAG);
2517   
2515
25182516    if(LOG_SOUND)
25192517        logerror("Nimbus SoundW %05X write of %02X to %04X\n",pc,data,(offset*2)+0xE0);
25202518
src/mess/machine/c1571.c
r7305r7306
121121
122122   int atn = cbm_iec_atn_r(c1571->serial_bus);
123123   int data = !c1571->data_out & !(c1571->atn_ack ^ !atn);
124   
124
125125   /* fast serial data */
126126   if (c1571->ser_dir) data &= c1571->sp_out;
127   
127
128128   cbm_iec_data_w(c1571->serial_bus, device, data);
129129}
130130
r7305r7306
133133   c1571_t *c1571 = get_safe_token(device);
134134
135135   int srq = 1;
136   
136
137137   /* fast serial clock */
138138   if (c1571->ser_dir) srq &= c1571->cnt_out;
139139
r7305r7306
734734
735735static const wd17xx_interface c1571_wd1770_intf =
736736{
737   DEVCB_LINE_GND,
737738   DEVCB_NULL,
738739   DEVCB_NULL,
739740   { FLOPPY_0, NULL, NULL, NULL }
r7305r7306
881882   c1571->serial_bus = devtag_get_device(device->machine, config->serial_bus_tag);
882883   c1571->image = device->subdevice(FLOPPY_0);
883884
884   /* set floppy density */
885   wd17xx_set_density(c1571->wd1770, DEN_MFM_LO);
886
887885   /* allocate data timer */
888886   c1571->bit_timer = timer_alloc(device->machine, bit_tick, (void *)device);
889887
src/mess/machine/pk8020.c
r7305r7306
986986
987987MACHINE_RESET( pk8020 )
988988{
989   running_device *fdc = devtag_get_device(machine, "wd1793");
990989   pk8020_set_bank(machine,0);
991990   cpu_set_irq_callback(devtag_get_device(machine, "maincpu"), pk8020_irq_callback);
992991
993   wd17xx_set_density (fdc,DEN_FM_HI);
994
995992   sound_gate = 0;
996993   sound_level = 0;
997994}
src/mess/machine/bbc.c
r7305r7306
16631663   wd17xx_set_side(fdc,(data>>2) & 0x01);
16641664
16651665   /* set density */
1666   if ((data>>3) & 0x01)
1667   {
1668      /* single density */
1669      wd17xx_set_density(fdc,DEN_FM_HI);
1670   }
1671   else
1672   {
1673      /* double density */
1674      wd17xx_set_density(fdc,DEN_MFM_LO);
1675   }
1666   wd17xx_dden_w(fdc, BIT(data, 3));
16761667
16771668   bbc_1770_IntEnabled=(((data>>4) & 0x01)==0);
16781669
r7305r7306
17831774   wd17xx_set_side(fdc,(data>>0) & 0x01);
17841775
17851776   /* set density */
1786   if ((data>>5) & 0x01)
1787   {
1788      /* single density */
1789      wd17xx_set_density(fdc,DEN_FM_HI);
1790   }
1791   else
1792   {
1793      /* double density */
1794      wd17xx_set_density(fdc,DEN_MFM_LO);
1795   }
1777   wd17xx_dden_w(fdc, BIT(data, 5));
17961778
17971779   bbc_1770_IntEnabled=(data>>4) & 0x01;
17981780
r7305r7306
19421924   wd17xx_set_side(fdc,(data>>4) & 0x01);
19431925
19441926   /* set density */
1945   if ((data>>5) & 0x01)
1946   {
1947      /* single density */
1948      wd17xx_set_density(fdc,DEN_FM_HI);
1949   }
1950   else
1951   {
1952      /* double density */
1953      wd17xx_set_density(fdc,DEN_MFM_LO);
1954   }
1927   wd17xx_dden_w(fdc, BIT(data, 5));
19551928
19561929//  bbc_1770_IntEnabled=(((data>>4) & 0x01)==0);
19571930   bbc_1770_IntEnabled=1;
src/mess/drivers/x1.c
r7305r7306
975975{
976976   DEVCB_NULL,
977977   DEVCB_NULL,
978   DEVCB_NULL,
978979   {FLOPPY_0, FLOPPY_1, FLOPPY_2, FLOPPY_3}
979980};
980981
src/mess/drivers/xor100.c
r7305r7306
249249   case 3: state->fdc_dden = state->fdc_dden; break;
250250   }
251251
252   wd17xx_set_density(state->wd1795, state->fdc_dden ? DEN_FM_HI : DEN_FM_LO);
252   wd17xx_dden_w(state->wd1795, state->fdc_dden);
253253}
254254
255255/* Memory Maps */
r7305r7306
507507
508508static const wd17xx_interface wd1795_intf =
509509{
510   DEVCB_NULL,
510511   DEVCB_LINE(fdc_irq_w),
511512   DEVCB_LINE(fdc_drq_w),
512513   { FLOPPY_0, FLOPPY_1, NULL, NULL }
src/mess/drivers/atarist.c
r7305r7306
104104
105105static const wd17xx_interface atarist_wd17xx_interface =
106106{
107   DEVCB_NULL,
107108   DEVCB_LINE(atarist_fdc_intrq_w),
108109   DEVCB_LINE(atarist_fdc_drq_w),
109110   {FLOPPY_0, FLOPPY_1, NULL, NULL}
r7305r7306
17961797
17971798static DEVICE_IMAGE_LOAD( atarist_serial )
17981799{
1799   /* filename specified */   
1800   /* filename specified */
18001801   if (device_load_serial(image)==INIT_PASS)
18011802   {
18021803      serial_device_setup(image, 9600, 8, 1, SERIAL_PARITY_NONE);
r7305r7306
18251826
18261827#define MDRV_ATARIST_SERIAL_ADD(_tag) \
18271828   MDRV_DEVICE_ADD(_tag, ATARIST_SERIAL, 0)
1828   
1829
18291830static const floppy_config atarist_floppy_config =
18301831{
18311832   DEVCB_NULL,
r7305r7306
18941895   MDRV_RAM_ADD("messram")
18951896   MDRV_RAM_DEFAULT_SIZE("1024K")  // 1040ST
18961897   MDRV_RAM_EXTRA_OPTIONS("512K,256K") //  520ST ,260ST
1897   
1898
18981899   MDRV_ATARIST_SERIAL_ADD("serial")
18991900MACHINE_DRIVER_END
19001901
r7305r7306
19701971   MDRV_RAM_ADD("messram")
19711972   MDRV_RAM_DEFAULT_SIZE("1024K")  // 1040STe
19721973   MDRV_RAM_EXTRA_OPTIONS("512K") //  520STe
1973   
1974
19741975   MDRV_ATARIST_SERIAL_ADD("serial")
19751976MACHINE_DRIVER_END
19761977
r7305r7306
19871988   MDRV_RAM_MODIFY("messram")
19881989   MDRV_RAM_DEFAULT_SIZE("4M")  //  Mega STe 4
19891990   MDRV_RAM_EXTRA_OPTIONS("2M,1M") //  Mega STe 2 ,Mega STe 1
1990   
1991
19911992   MDRV_ATARIST_SERIAL_ADD("serial2")
19921993MACHINE_DRIVER_END
19931994
r7305r7306
20422043   MDRV_RAM_ADD("messram")
20432044   MDRV_RAM_DEFAULT_SIZE("4M")
20442045   MDRV_RAM_EXTRA_OPTIONS("1M")
2045   
2046
20462047   MDRV_ATARIST_SERIAL_ADD("serial")
20472048   MDRV_ATARIST_SERIAL_ADD("serial2")
20482049MACHINE_DRIVER_END
r7305r7306
21832184   ROM_SYSTEM_BIOS( 0, "tos492", "TOS 4.92" )
21842185   ROMX_LOAD( "tos492.img", 0xe00000, 0x080000, BAD_DUMP CRC(bc8e497f) SHA1(747a38042844a6b632dcd9a76d8525fccb5eb892), ROM_BIOS(2) )
21852186ROM_END
2186   
2187
21872188/* System Drivers */
21882189
21892190/*     YEAR  NAME    PARENT    COMPAT   MACHINE   INPUT     INIT   COMPANY    FULLNAME */
src/mess/drivers/vector06.c
r7305r7306
157157   DO_NOT_KEEP_GEOMETRY
158158};
159159
160const wd17xx_interface vector06_wd17xx_interface =
161{
162   DEVCB_LINE_VCC,
163   DEVCB_NULL,
164   DEVCB_NULL,
165   { FLOPPY_0, FLOPPY_1, NULL, NULL}
166};
167
160168/* Machine driver */
161169static MACHINE_DRIVER_START( vector06 )
162170  /* basic machine hardware */
r7305r7306
192200
193201   MDRV_CASSETTE_ADD( "cassette", vector_cassette_config )
194202
195   MDRV_WD1793_ADD("wd1793", default_wd17xx_interface_2_drives )
203   MDRV_WD1793_ADD("wd1793", vector06_wd17xx_interface)
196204   MDRV_FLOPPY_2_DRIVES_ADD(vector_floppy_config)
197205
198206   /* cartridge */
src/mess/drivers/v1050.c
r7305r7306
817817   floppy_drive_set_ready_state(get_floppy_image(device->machine, 1), f_motor_on, 1);
818818
819819   /* density select */
820   wd17xx_set_density(state->mb8877, BIT(data, 7) ? DEN_FM_LO : DEN_FM_HI);
820   wd17xx_dden_w(state->mb8877, BIT(data, 7));
821821}
822822
823823static WRITE8_DEVICE_HANDLER( misc_8255_b_w )
r7305r7306
10771077
10781078static const wd17xx_interface v1050_wd17xx_intf =
10791079{
1080   DEVCB_NULL,
10801081   DEVCB_LINE(v1050_mb8877_intrq_w),
10811082   DEVCB_LINE(v1050_mb8877_drq_w),
10821083   {FLOPPY_0,FLOPPY_1,NULL,NULL}
src/mess/drivers/orion.c
r7305r7306
101101      FIRST_SECTOR_ID([1]))
102102FLOPPY_OPTIONS_END
103103
104static const wd17xx_interface orion_wd17xx_interface =
105{
106   DEVCB_LINE_VCC,
107   DEVCB_NULL,
108   DEVCB_NULL,
109   { FLOPPY_0, FLOPPY_1, FLOPPY_2, FLOPPY_3 }
110};
111
104112static const floppy_config orion_floppy_config =
105113{
106114   DEVCB_NULL,
r7305r7306
147155
148156   MDRV_CASSETTE_ADD( "cassette", orion_cassette_config )
149157
150   MDRV_WD1793_ADD("wd1793", default_wd17xx_interface )
158   MDRV_WD1793_ADD("wd1793", orion_wd17xx_interface )
151159
152160   MDRV_FLOPPY_4_DRIVES_ADD(orion_floppy_config)
153161
r7305r7306
211219
212220   MDRV_CASSETTE_ADD( "cassette", orion_cassette_config )
213221
214   MDRV_WD1793_ADD("wd1793", default_wd17xx_interface )
222   MDRV_WD1793_ADD("wd1793", orion_wd17xx_interface )
215223
216224   MDRV_FLOPPY_4_DRIVES_ADD(orion_floppy_config)
217225
r7305r7306
234242    MDRV_CPU_PROGRAM_MAP(orionpro_mem)
235243    MDRV_CPU_IO_MAP(orionpro_io)
236244
237    MDRV_MACHINE_START( orionpro )
238245    MDRV_MACHINE_RESET( orionpro )
239246
240247   MDRV_I8255A_ADD( "ppi8255_1", orion128_ppi8255_interface_1 )
r7305r7306
266273
267274   MDRV_CASSETTE_ADD( "cassette", orion_cassette_config )
268275
269   MDRV_WD1793_ADD("wd1793", default_wd17xx_interface )
276   MDRV_WD1793_ADD("wd1793", orion_wd17xx_interface )
270277
271278   MDRV_FLOPPY_4_DRIVES_ADD(orion_floppy_config)
272279
src/mess/drivers/fmtowns.c
r7305r7306
456456            floppy_drive_set_ready_state(floppy_get_device(space->machine, towns_selected_drive-1), data & 0x10,0);
457457         }
458458         wd17xx_set_side(fdc,(data & 0x04)>>2);
459         wd17xx_set_density(fdc,(DENSITY)((data & 0x02)>>1));
459         wd17xx_dden_w(fdc, BIT(data, 1));
460
460461         towns_fdc_irq6mask = data & 0x01;
461462         logerror("FDC: write %02x to offset 0x08\n",data);
462463         break;
r7305r7306
762763      ret |= ((input_port_read(space->machine,"joy2") & 0x3f) << 16) | 0x00400000;
763764   else
764765      ret |= 0x003f0000;
765   
766
766767   if(extra1 & 0x01) // Run button = left+right
767768      ret &= ~0x0000000c;
768769   if(extra2 & 0x01)
r7305r7306
20292030
20302031static const wd17xx_interface towns_mb8877a_interface =
20312032{
2033   DEVCB_NULL,
20322034   DEVCB_DEVICE_LINE("pic8259_master",towns_mb8877a_irq_w),
20332035   DEVCB_DEVICE_LINE("dma_1", towns_mb8877a_drq_w),
20342036   {FLOPPY_0,FLOPPY_1,0,0}
src/mess/drivers/nascom1.c
r7305r7306
343343   MDRV_CPU_MODIFY("maincpu")
344344   MDRV_CPU_IO_MAP(nascom2_io)
345345
346   MDRV_MACHINE_RESET( nascom2 )
347
348346   /* video hardware */
349347   MDRV_SCREEN_MODIFY("screen")
350348   MDRV_SCREEN_SIZE(48 * 8, 16 * 14)
src/mess/drivers/samcoupe.c
r7305r7306
561561   DO_NOT_KEEP_GEOMETRY
562562};
563563
564static const wd17xx_interface samcoupe_wd17xx_intf =
565{
566   DEVCB_LINE_GND,
567   DEVCB_NULL,
568   DEVCB_NULL,
569   { FLOPPY_0, FLOPPY_1, NULL, NULL }
570};
571
564572static MACHINE_DRIVER_START( samcoupe )
565573   /* basic machine hardware */
566574   MDRV_CPU_ADD("maincpu", Z80, SAMCOUPE_XTAL_X1 / 4) /* 6 MHz */
r7305r7306
586594   MDRV_CENTRONICS_ADD("lpt1", standard_centronics)
587595   MDRV_CENTRONICS_ADD("lpt2", standard_centronics)
588596   MDRV_MSM6242_ADD("sambus_clock")
589   MDRV_WD1772_ADD("wd1772", default_wd17xx_interface_2_drives)
597   MDRV_WD1772_ADD("wd1772", samcoupe_wd17xx_intf)
590598   MDRV_CASSETTE_ADD("cassette", samcoupe_cassette_config)
591599
592600   /* sound hardware */
src/mess/drivers/tiki100.c
r7305r7306
211211   if (BIT(data, 1)) wd17xx_set_drive(state->fd1797, 1);
212212
213213   /* density select */
214   wd17xx_set_density(state->fd1797, BIT(data, 4) ? DEN_FM_LO : DEN_FM_HI);
214   wd17xx_dden_w(state->fd1797, BIT(data, 4));
215215
216216   /* floppy motor */
217217   floppy_mon_w(get_floppy_image(space->machine, 0), !BIT(data, 6));
r7305r7306
542542{
543543   DEVCB_NULL,
544544   DEVCB_NULL,
545   DEVCB_NULL,
545546   { FLOPPY_0, FLOPPY_1, NULL, NULL }
546547};
547548
src/mess/drivers/fm7.c
r7305r7306
18051805
18061806static const wd17xx_interface fm7_mb8877a_interface =
18071807{
1808   DEVCB_NULL,
18081809   DEVCB_LINE(fm7_fdc_intrq_w),
18091810   DEVCB_LINE(fm7_fdc_drq_w),
18101811   {FLOPPY_0, FLOPPY_1, FLOPPY_2, FLOPPY_3}
src/mess/drivers/ht68k.c
r7305r7306
9696
9797static const wd17xx_interface ht68k_wd17xx_interface =
9898{
99   DEVCB_NULL,
99100   DEVCB_LINE(ht68k_fdc_intrq_w),
100101   DEVCB_NULL,
101102   {FLOPPY_0, FLOPPY_1, FLOPPY_2, FLOPPY_3}
src/mess/drivers/bw2.c
r7305r7306
516516static MACHINE_START( bw2 )
517517{
518518   bw2_state *state = (bw2_state *) machine->driver_data;
519   running_device *fdc = devtag_get_device(machine, "wd179x");
520519
521   wd17xx_set_density(fdc,DEN_MFM_LO);
522
523520   /* find devices */
524521   state->msm8251 = devtag_get_device(machine, MSM8251_TAG);
525522   state->msm6255 = devtag_get_device(machine, MSM6255_TAG);
r7305r7306
775772
776773static const wd17xx_interface bw2_wd17xx_interface =
777774{
775   DEVCB_LINE_GND,
778776   DEVCB_CPU_INPUT_LINE(Z80_TAG, INPUT_LINE_IRQ0),
779777   DEVCB_LINE(bw2_wd17xx_drq_w),
780778   {FLOPPY_0, FLOPPY_1, NULL, NULL}
r7305r7306
810808      case DEVINFO_STR_IMAGE_FILE_EXTENSIONS:       strcpy(info->s, "txt");                                         break;
811809      case DEVINFO_INT_IMAGE_READABLE:            info->i = 1;                                           break;
812810      case DEVINFO_INT_IMAGE_WRITEABLE:         info->i = 0;                                           break;
813      case DEVINFO_INT_IMAGE_CREATABLE:           info->i = 0;                                           break;     
811      case DEVINFO_INT_IMAGE_CREATABLE:           info->i = 0;                                           break;
814812      default:                            DEVICE_GET_INFO_CALL(serial);   break;
815813   }
816814}
r7305r7306
819817
820818#define MDRV_BW2_SERIAL_ADD(_tag) \
821819   MDRV_DEVICE_ADD(_tag, BW2_SERIAL, 0)
822   
823820
821
824822static MACHINE_DRIVER_START( bw2 )
825823   MDRV_DRIVER_DATA(bw2_state)
826824
r7305r7306
864862   MDRV_RAM_ADD("messram")
865863   MDRV_RAM_DEFAULT_SIZE("64K")
866864   MDRV_RAM_EXTRA_OPTIONS("96K,128K,160K,192K,224K")
867   
865
868866   MDRV_BW2_SERIAL_ADD("serial")
869867MACHINE_DRIVER_END
870868
src/mess/drivers/enterp.c
r7305r7306
179179
180180static MACHINE_RESET( enterprise )
181181{
182   running_device *fdc = devtag_get_device(machine, "wd1770");
183182   cpu_set_input_line_vector(devtag_get_device(machine, "maincpu"), 0, 0xff);
184
185   wd17xx_set_density(fdc, DEN_FM_HI);
186183}
187184
188185
r7305r7306
246243   if (BIT(data, 2)) wd17xx_set_drive(fdc, 2);
247244   if (BIT(data, 3)) wd17xx_set_drive(fdc, 3);
248245
249   /* side */
250246   wd17xx_set_side(fdc, BIT(data, 4));
247   wd17xx_dden_w(fdc, BIT(data, 5));
251248}
252249
253250/***************************************************************************
r7305r7306
427424
428425static const wd17xx_interface enterp_wd1770_interface =
429426{
427   DEVCB_NULL,
430428   DEVCB_LINE(enterp_wd1770_intrq_w),
431429   DEVCB_LINE(enterp_wd1770_drq_w),
432430   {FLOPPY_0, FLOPPY_1, FLOPPY_2, FLOPPY_3}
src/mess/drivers/apricot.c
r7305r7306
182182
183183static const wd17xx_interface apricot_wd17xx_intf =
184184{
185   DEVCB_LINE_GND,
185186   DEVCB_LINE(apricot_wd2793_intrq_w),
186187   DEVCB_LINE(apricot_wd2793_drq_w),
187188   { FLOPPY_0, FLOPPY_1, NULL, NULL }
src/mess/drivers/apricotf.c
r7305r7306
125125   }
126126}
127127
128static const wd17xx_interface act_wd2797_interface =
129{
130   DEVCB_NULL,
131   DEVCB_NULL,
132   {FLOPPY_0, FLOPPY_1 }
133};
134
135128static READ16_HANDLER( act_pal_r )
136129{
137130   act_state *state = (act_state *)space->machine->driver_data;
r7305r7306
317310   MDRV_PALETTE_LENGTH(16)
318311//  MDRV_PALETTE_INIT(black_and_white)
319312
320   MDRV_WD2793_ADD("fdc", act_wd2797_interface )
313   MDRV_WD2793_ADD("fdc", default_wd17xx_interface_2_drives )
321314
322315   MDRV_GFXDECODE(act_f1)
323316
src/mess/drivers/a310.c
r7305r7306
202202
203203static const wd17xx_interface a310_wd17xx_interface =
204204{
205   DEVCB_NULL,
205206   DEVCB_LINE(a310_wd177x_intrq_w),
206207   DEVCB_LINE(a310_wd177x_drq_w),
207208   {FLOPPY_0, FLOPPY_1, FLOPPY_2, FLOPPY_3}
src/mess/drivers/xerox820.c
r7305r7306
140140   xerox820_state *state = (xerox820_state *)machine->driver_data;
141141   const address_space *program = cputag_get_address_space(machine, Z80_TAG, ADDRESS_SPACE_PROGRAM);
142142   UINT8 *ram = messram_get_ptr(devtag_get_device(machine, "messram"));
143   
143
144144   if (bank)
145145   {
146146      /* ROM */
r7305r7306
161161   xerox820_state *state = (xerox820_state *)machine->driver_data;
162162   const address_space *program = cputag_get_address_space(machine, Z80_TAG, ADDRESS_SPACE_PROGRAM);
163163   UINT8 *ram = messram_get_ptr(devtag_get_device(machine, "messram"));
164   
164
165165   if (bank)
166166   {
167167      /* ROM */
r7305r7306
212212{
213213   xerox820_state *state = (xerox820_state *)space->machine->driver_data;
214214
215   wd17xx_set_density(state->wd1771, offset ? DEN_MFM_HI : DEN_MFM_LO);
215   wd17xx_dden_w(state->wd1771, offset ? CLEAR_LINE : ASSERT_LINE);
216216}
217217
218218static WRITE8_HANDLER( chrom_w )
r7305r7306
242242      /* set internal clocks for asynchronous sio A */
243243   }
244244}
245   
245
246246/* Memory Maps */
247247
248248static ADDRESS_MAP_START( xerox820_mem, ADDRESS_SPACE_PROGRAM, 8 )
r7305r7306
612612
613613static const wd17xx_interface wd1771_intf =
614614{
615   DEVCB_NULL,
615616   DEVCB_LINE(xerox820_wd1771_intrq_w),
616617   DEVCB_LINE(xerox820_wd1771_drq_w),
617618   {FLOPPY_0, FLOPPY_1, NULL, NULL}
r7305r7306
929930
930931static MACHINE_DRIVER_START( xerox168 )
931932   MDRV_IMPORT_FROM( xerox820ii )
932   
933
933934   MDRV_CPU_ADD(I8086_TAG, I8086, 4770000)
934935    MDRV_CPU_PROGRAM_MAP(xerox168_mem)
935936
src/mess/drivers/pk8020.c
r7305r7306
168168   DO_NOT_KEEP_GEOMETRY
169169};
170170
171static const wd17xx_interface pk8020_wd17xx_interface =
172{
173   DEVCB_LINE_VCC,
174   DEVCB_NULL,
175   DEVCB_NULL,
176   { FLOPPY_0, FLOPPY_1, FLOPPY_2, FLOPPY_3 }
177};
178
171179/* F4 Character Displayer */
172180static const gfx_layout pk8020_charlayout =
173181{
r7305r7306
219227   MDRV_MSM8251_ADD( "rs232", default_msm8251_interface)
220228   MDRV_MSM8251_ADD( "lan", default_msm8251_interface)
221229
222   MDRV_WD1793_ADD( "wd1793", default_wd17xx_interface )
230   MDRV_WD1793_ADD( "wd1793", pk8020_wd17xx_interface )
223231
224232   /* audio hardware */
225233   MDRV_SPEAKER_STANDARD_MONO("mono")
r7305r7306
243251   ROM_REGION( 0x16000, "maincpu", ROMREGION_ERASEFF )
244252   ROM_DEFAULT_BIOS("v11")
245253   ROM_SYSTEM_BIOS(0, "v11", "v1.1")
246   ROMX_LOAD( "korvet11.rom", 0x10000, 0x6000, CRC(81bdc2af) SHA1(c3484c3f1f3d252475979283c073286b8661d2b9), ROM_BIOS(1))   
254   ROMX_LOAD( "korvet11.rom", 0x10000, 0x6000, CRC(81bdc2af) SHA1(c3484c3f1f3d252475979283c073286b8661d2b9), ROM_BIOS(1))
247255   ROM_SYSTEM_BIOS(1, "v20", "v2.0")
248   ROMX_LOAD( "korvet20.rom", 0x10000, 0x6000, CRC(d6c36a45) SHA1(dba67e63457251814ad5c0fe6bb6d584eea5c7d2), ROM_BIOS(2))   
256   ROMX_LOAD( "korvet20.rom", 0x10000, 0x6000, CRC(d6c36a45) SHA1(dba67e63457251814ad5c0fe6bb6d584eea5c7d2), ROM_BIOS(2))
249257   ROM_SYSTEM_BIOS(2, "cpm", "cpm")
250258   ROMX_LOAD( "cpm.rom",      0x10000, 0x4000, CRC(7a38d7f6) SHA1(fec6623291a38990b003e818683cd5edfb494c36), ROM_BIOS(3))
251259   ROM_REGION( 0x2000, "gfx1", 0 )
r7305r7306
271279   ROM_LOAD( "kontur.fnt", 0x0000, 0x2000, CRC(14d33790) SHA1(6d5fcb214805c5fc44ef98a97219158ff7826ac0))
272280ROM_END
273281
274   
282
275283/* Driver */
276284
277285/*    YEAR  NAME    PARENT  COMPAT  MACHINE     INPUT       INIT     COMPANY                  FULLNAME   FLAGS */

Previous 15994 Revisions Next


© 1998-2018 The MESS Team