Previous 199869 Revisions Next

r18431 Wednesday 10th October, 2012 at 21:14:56 UTC by smf
Uses logical levels rather than voltage levels for control signals, you have to write 0 to the data lines when you're not sending data. Added a kludge to stop the ff from the 6522 from preventing the bus from being read, this may or may not be how the hardware really works. [smf]
[src/emu/machine]scsibus.c scsicb.c scsidev.c scsihle.c
[src/mess/drivers]bullet.c v1050.c
[src/mess/machine]d9060.c d9060.h e01.c lux4105.c lux4105.h rmnimbus.c

trunk/src/emu/machine/scsibus.c
r18430r18431
99
1010void scsibus_device::scsi_update()
1111{
12   UINT32 newdata = SCSI_MASK_ALL;
12   UINT32 newdata = 0;
1313
1414   for( int i = 0; i < deviceCount; i++ )
1515   {
16      newdata &= devices[ i ]->data_out;
16      newdata |= devices[ i ]->data_out;
1717   }
1818
19   newdata &= SCSI_MASK_ALL;
20
1921   UINT32 mask = data ^ newdata;
2022
2123   if( mask != 0 )
r18430r18431
4749      }
4850   }
4951
50   data = SCSI_MASK_ALL;
52   data = 0;
5153}
5254
5355const device_type SCSIBUS = &device_creator<scsibus_device>;
trunk/src/emu/machine/scsihle.c
r18430r18431
280280   switch( tid )
281281   {
282282   case 0:
283      scsi_out(param * SCSI_MASK_REQ, SCSI_MASK_REQ);
283      scsi_out(param ? SCSI_MASK_REQ : 0, SCSI_MASK_REQ);
284284      break;
285285
286286   case 1:
287      scsi_out(param * SCSI_MASK_BSY, SCSI_MASK_BSY);
287      scsi_out(param ? SCSI_MASK_BSY : 0, SCSI_MASK_BSY);
288288      break;
289289
290290   case 2:
r18430r18431
411411   switch(phase)
412412   {
413413      case SCSI_PHASE_BUS_FREE:
414         scsi_out( SCSI_MASK_ALL, SCSI_MASK_ALL );
414         scsi_out( 0, SCSI_MASK_ALL );
415415         LOG(1,"SCSIBUS: done\n\n");
416416         break;
417417
418418      case SCSI_PHASE_COMMAND:
419         scsi_out( SCSI_MASK_DATA | SCSI_MASK_IO | SCSI_MASK_MSG, SCSI_MASK_DATA | SCSI_MASK_CD | SCSI_MASK_IO | SCSI_MASK_MSG );
419         scsi_out( SCSI_MASK_CD, SCSI_MASK_DATA | SCSI_MASK_CD | SCSI_MASK_IO | SCSI_MASK_MSG );
420420         LOG(1,"\nSCSIBUS: Command begin\n");
421         scsi_out_req_delay( 0 );
421         scsi_out_req_delay( 1 );
422422         break;
423423
424424      case SCSI_PHASE_DATAOUT:
425         scsi_out( SCSI_MASK_DATA | SCSI_MASK_CD | SCSI_MASK_IO | SCSI_MASK_MSG, SCSI_MASK_DATA | SCSI_MASK_CD | SCSI_MASK_IO | SCSI_MASK_MSG );
426         scsi_out_req_delay( 0 );
425         scsi_out( 0, SCSI_MASK_DATA | SCSI_MASK_CD | SCSI_MASK_IO | SCSI_MASK_MSG );
426         scsi_out_req_delay( 1 );
427427         break;
428428
429429      case SCSI_PHASE_DATAIN:
430         scsi_out( SCSI_MASK_CD | SCSI_MASK_MSG, SCSI_MASK_CD | SCSI_MASK_IO | SCSI_MASK_MSG );
431         scsi_out_req_delay( 0 );
430         scsi_out( SCSI_MASK_IO, SCSI_MASK_CD | SCSI_MASK_IO | SCSI_MASK_MSG );
431         scsi_out_req_delay( 1 );
432432         break;
433433
434434      case SCSI_PHASE_STATUS:
435         scsi_out( SCSI_STATUS_OK | SCSI_MASK_MSG, SCSI_MASK_DATA | SCSI_MASK_CD | SCSI_MASK_IO | SCSI_MASK_MSG );
436         scsi_out_req_delay( 0 );
435         scsi_out( SCSI_STATUS_OK | SCSI_MASK_CD | SCSI_MASK_IO, SCSI_MASK_DATA | SCSI_MASK_CD | SCSI_MASK_IO | SCSI_MASK_MSG );
436         scsi_out_req_delay( 1 );
437437         break;
438438
439439      case SCSI_PHASE_MESSAGE_OUT:
440         scsi_out( SCSI_MASK_DATA | SCSI_MASK_IO, SCSI_MASK_DATA | SCSI_MASK_CD | SCSI_MASK_IO | SCSI_MASK_MSG );
441         scsi_out_req_delay( 0 );
440         scsi_out( SCSI_MASK_CD | SCSI_MASK_MSG, SCSI_MASK_DATA | SCSI_MASK_CD | SCSI_MASK_IO | SCSI_MASK_MSG );
441         scsi_out_req_delay( 1 );
442442         break;
443443
444444      case SCSI_PHASE_MESSAGE_IN:
445         scsi_out( 0, SCSI_MASK_DATA | SCSI_MASK_CD | SCSI_MASK_IO | SCSI_MASK_MSG );// no errors for the time being !
446         scsi_out_req_delay( 0 );
445         scsi_out( 0 | SCSI_MASK_CD | SCSI_MASK_IO | SCSI_MASK_MSG, SCSI_MASK_DATA | SCSI_MASK_CD | SCSI_MASK_IO | SCSI_MASK_MSG );// no errors for the time being !
446         scsi_out_req_delay( 1 );
447447         break;
448448   }
449449}
r18430r18431
451451void scsihle_device::scsi_in( UINT32 data, UINT32 mask )
452452{
453453   // Reset aborts and returns to bus free
454   if( ( mask & SCSI_MASK_RST ) != 0 && ( data & SCSI_MASK_RST ) == 0 )
454   if( ( mask & SCSI_MASK_RST ) != 0 && ( data & SCSI_MASK_RST ) != 0 )
455455   {
456456      scsi_change_phase(SCSI_PHASE_BUS_FREE);
457457      cmd_idx=0;
r18430r18431
474474            GetDevice(&hdfile);
475475            if(hdfile!=(void *)NULL)
476476            {
477               if( ( data & SCSI_MASK_SEL ) != 0 )
477               if( ( data & SCSI_MASK_SEL ) == 0 )
478478               {
479479                  sectorbytes = GetSectorBytes();
480480                  scsi_change_phase(SCSI_PHASE_COMMAND);
481481               }
482482               else
483483               {
484                  sel_timer->adjust(attotime::from_nsec(BSY_DELAY_NS),0);
484                  sel_timer->adjust(attotime::from_nsec(BSY_DELAY_NS),1);
485485               }
486486            }
487487         }
r18430r18431
490490      case SCSI_PHASE_COMMAND:
491491         if( ( mask & SCSI_MASK_ACK ) != 0 )
492492         {
493            if( ( data & SCSI_MASK_ACK ) != 0 )
493            if( ( data & SCSI_MASK_ACK ) == 0 )
494494            {
495495               command[ cmd_idx++ ] = data & SCSI_MASK_DATA;
496496
r18430r18431
501501               }
502502               else
503503               {
504                  scsi_out_req_delay( 0 );
504                  scsi_out_req_delay( 1 );
505505               }
506506            }
507507            else
508508            {
509               scsi_out_req_delay( 1 );
509               scsi_out_req_delay( 0 );
510510            }
511511         }
512512         break;
r18430r18431
514514      case SCSI_PHASE_DATAIN:
515515         if( ( mask & SCSI_MASK_ACK ) != 0 )
516516         {
517            if( ( data & SCSI_MASK_ACK ) != 0 )
517            if( ( data & SCSI_MASK_ACK ) == 0 )
518518            {
519519               // check to see if we have reached the end of the block buffer
520520               // and that there is more data to read from the scsi disk
r18430r18431
530530               else
531531               {
532532                  scsi_out( buffer[ data_idx++ ], SCSI_MASK_DATA );
533                  scsi_out_req_delay( 0 );
533                  scsi_out_req_delay( 1 );
534534               }
535535            }
536536            else
537537            {
538               scsi_out_req_delay( 1 );
538               scsi_out_req_delay( 0 );
539539            }
540540         }
541541         break;
r18430r18431
543543      case SCSI_PHASE_DATAOUT:
544544         if( ( mask & SCSI_MASK_ACK ) != 0 )
545545         {
546            if( ( data & SCSI_MASK_ACK ) != 0 )
546            if( ( data & SCSI_MASK_ACK ) == 0 )
547547            {
548548               //LOG(1,"SCSIBUS:bytes_left=%02X data_idx=%02X\n",bytes_left,data_idx);
549549               buffer[data_idx++]=data & SCSI_MASK_DATA;
r18430r18431
578578               }
579579               else
580580               {
581                  scsi_out_req_delay( 0 );
581                  scsi_out_req_delay( 1 );
582582               }
583583            }
584584            else
585585            {
586               scsi_out_req_delay( 1 );
586               scsi_out_req_delay( 0 );
587587            }
588588         }
589589         break;
r18430r18431
591591      case SCSI_PHASE_STATUS:
592592         if( ( mask & SCSI_MASK_ACK ) != 0 )
593593         {
594            if( ( data & SCSI_MASK_ACK ) != 0 )
594            if( ( data & SCSI_MASK_ACK ) == 0 )
595595            {
596596               if(cmd_idx > 0)
597597               {
r18430r18431
599599               }
600600               else
601601               {
602                  scsi_out_req_delay( 0 );
602                  scsi_out_req_delay( 1 );
603603               }
604604            }
605605            else
606606            {
607607               cmd_idx++;
608               scsi_out_req_delay( 1 );
608               scsi_out_req_delay( 0 );
609609            }
610610         }
611611         break;
r18430r18431
613613      case SCSI_PHASE_MESSAGE_IN:
614614         if( ( mask & SCSI_MASK_ACK ) != 0 )
615615         {
616            if( ( data & SCSI_MASK_ACK ) != 0 )
616            if( ( data & SCSI_MASK_ACK ) == 0 )
617617            {
618618               if(cmd_idx > 0)
619619               {
r18430r18431
624624               }
625625               else
626626               {
627                  scsi_out_req_delay( 0 );
627                  scsi_out_req_delay( 1 );
628628               }
629629            }
630630            else
631631            {
632632               cmd_idx++;
633               scsi_out_req_delay( 1 );
633               scsi_out_req_delay( 0 );
634634            }
635635         }
636636         break;
trunk/src/emu/machine/scsicb.c
r18430r18431
4545{
4646   scsidev_device::device_start();
4747
48   linestate = SCSI_MASK_ALL;
48   linestate = 0;
4949
5050   out_bsy_func.resolve(_out_bsy_func, *this);
5151   out_sel_func.resolve(_out_sel_func, *this);
r18430r18431
118118
119119UINT8 scsicb_device::get_scsi_line( UINT32 mask )
120120{
121   UINT8 state = (int)( ( linestate & mask ) != 0 );
121   UINT8 state;
122122
123   if( ( linestate & mask ) != 0 )
124   {
125      state = 1;
126   }
127   else
128   {
129      state = 0;
130   }
131
123132   verboselog( 1, machine(), "%s get_scsi_line %s %d\n", tag(), get_line_name( mask ), state );
124133
125134   return state;
r18430r18431
129138{
130139   verboselog( 1, machine(), "%s set_scsi_line %s %d\n", tag(), get_line_name( mask ), state );
131140
132   scsi_out( state * mask, mask );
141   if( state )
142   {
143      scsi_out( mask, mask );
144   }
145   else
146   {
147      scsi_out( 0, mask );
148   }
133149}
134150
135151void scsicb_device::trigger_callback( UINT32 update_mask, UINT32 line_mask, devcb_resolved_write_line &write_line )
136152{
137153   if( ( update_mask & line_mask ) != 0 && !write_line.isnull() )
138154   {
139      int state = (int)( ( linestate & line_mask ) != 0 );
155      UINT8 state;
140156
157      if( ( linestate & line_mask ) != 0 )
158      {
159         state = 1;
160      }
161      else
162      {
163         state = 0;
164      }
165
141166      verboselog( 1, machine(), "%s trigger_callback %s %d\n", tag(), get_line_name( line_mask ), state );
142167
143168      write_line( state );
trunk/src/emu/machine/scsidev.c
r18430r18431
1818
1919void scsidev_device::device_start()
2020{
21   data_out = SCSI_MASK_ALL;
21   data_out = 0;
2222}
2323
2424void scsidev_device::scsi_out( UINT32 data, UINT32 mask )
trunk/src/mess/machine/lux4105.c
r18430r18431
3636
3737WRITE_LINE_MEMBER( luxor_4105_device::sasi_bsy_w )
3838{
39   if (!state)
39   if (state)
4040   {
41      m_sasibus->scsi_sel_w(1);
41      m_sasibus->scsi_sel_w(0);
4242   }
4343}
4444
4545WRITE_LINE_MEMBER( luxor_4105_device::sasi_io_w )
4646{
47   if (!m_io && state)
47   if (!state)
4848   {
4949      m_sasibus->scsi_data_w(m_data);
5050   }
5151
52   m_io = state;
53
5452   update_trrq_int();
5553}
5654
r18430r18431
5856{
5957   if (state)
6058   {
61      m_sasibus->scsi_ack_w(1);
59      m_sasibus->scsi_ack_w(0);
6260   }
6361
6462   update_trrq_int();
r18430r18431
145143
146144inline void luxor_4105_device::update_trrq_int()
147145{
148   int cd = m_sasibus->scsi_cd_r();
149   int req = m_sasibus->scsi_req_r();
146   int cd = !m_sasibus->scsi_cd_r();
147   int req = !m_sasibus->scsi_req_r();
150148   int trrq = !(cd & !req);
151149
152150   if (BIT(m_dma, 5))
r18430r18431
180178luxor_4105_device::luxor_4105_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
181179    : device_t(mconfig, LUXOR_4105, "Luxor 4105", tag, owner, clock),
182180     device_abc1600bus_card_interface(mconfig, *this),
183     m_sasibus(*this, SASIBUS_TAG ":host"),
184     m_io(1)
181     m_sasibus(*this, SASIBUS_TAG ":host")
185182{
186183}
187184
r18430r18431
196193
197194   // state saving
198195   save_item(NAME(m_cs));
199   save_item(NAME(m_io));
200196   save_item(NAME(m_data));
201197   save_item(NAME(m_dma));
202198}
r18430r18431
212208   m_data = 0;
213209   m_dma = 0;
214210
215   m_sasibus->scsi_rst_w(0);
216211   m_sasibus->scsi_rst_w(1);
212   m_sasibus->scsi_rst_w(0);
217213
218214   m_slot->trrq_w(1);
219215}
r18430r18431
279275
280276        */
281277
282      data = !m_sasibus->scsi_bsy_r();
283      data |= !m_sasibus->scsi_req_r() << 2;
284      data |= !m_sasibus->scsi_cd_r() << 3;
285      data |= !m_sasibus->scsi_io_r() << 6;
278      data = m_sasibus->scsi_bsy_r();
279      data |= m_sasibus->scsi_req_r() << 2;
280      data |= m_sasibus->scsi_cd_r() << 3;
281      data |= m_sasibus->scsi_io_r() << 6;
286282   }
287283
288284   return data;
r18430r18431
299295
300296   if (m_cs)
301297   {
302      if (m_sasibus->scsi_bsy_r())
298      if (!m_sasibus->scsi_bsy_r())
303299      {
304300         ioport("1E")->read();
305301      }
306302      else
307303      {
308         if (!m_sasibus->scsi_io_r())
304         if (m_sasibus->scsi_io_r())
309305         {
310306            data = m_sasibus->scsi_data_r();
311307
312            if (!m_sasibus->scsi_req_r())
308            if (m_sasibus->scsi_req_r())
313309            {
314               m_sasibus->scsi_ack_w(0);
310               m_sasibus->scsi_ack_w(1);
315311            }
316312         }
317313      }
r18430r18431
331327   {
332328      m_data = data;
333329
334      if (m_sasibus->scsi_io_r())
330      if (!m_sasibus->scsi_io_r())
335331      {
336332         m_sasibus->scsi_data_w(m_data);
337333
338         if (!m_sasibus->scsi_req_r())
334         if (m_sasibus->scsi_req_r())
339335         {
340            m_sasibus->scsi_ack_w(0);
336            m_sasibus->scsi_ack_w(1);
341337         }
342338      }
343339   }
r18430r18431
352348{
353349   if (m_cs)
354350   {
355      m_sasibus->scsi_sel_w(0);
351      m_sasibus->scsi_sel_w(1);
356352   }
357353}
358354
r18430r18431
368364      m_data = 0;
369365      m_dma = 0;
370366
371      m_sasibus->scsi_rst_w(0);
372367      m_sasibus->scsi_rst_w(1);
368      m_sasibus->scsi_rst_w(0);
373369   }
374370}
375371
trunk/src/mess/machine/lux4105.h
r18430r18431
7474   required_device<scsicb_device> m_sasibus;
7575
7676   int m_cs;
77   int m_io;
7877   UINT8 m_data;
7978   UINT8 m_dma;
8079};
trunk/src/mess/machine/rmnimbus.c
r18430r18431
24182418   rmnimbus_state *state = machine.driver_data<rmnimbus_state>();
24192419
24202420   state->m_nimbus_drives.reg410_in=0;
2421   state->m_nimbus_drives.reg410_in |= (state->m_scsibus->scsi_req_r() ? HDC_REQ_MASK : 0);
2422   state->m_nimbus_drives.reg410_in |= (state->m_scsibus->scsi_cd_r()  ? HDC_CD_MASK  : 0);
2423   state->m_nimbus_drives.reg410_in |= (state->m_scsibus->scsi_io_r()  ? HDC_IO_MASK  : 0);
2424   state->m_nimbus_drives.reg410_in |= (state->m_scsibus->scsi_bsy_r() ? HDC_BSY_MASK : 0);
2425   state->m_nimbus_drives.reg410_in |= (state->m_scsibus->scsi_msg_r() ? HDC_MSG_MASK : 0);
2421   state->m_nimbus_drives.reg410_in |= (state->m_scsibus->scsi_req_r() ? 0 : HDC_REQ_MASK);
2422   state->m_nimbus_drives.reg410_in |= (state->m_scsibus->scsi_cd_r()  ? 0 : HDC_CD_MASK);
2423   state->m_nimbus_drives.reg410_in |= (state->m_scsibus->scsi_io_r()  ? 0 : HDC_IO_MASK);
2424   state->m_nimbus_drives.reg410_in |= (state->m_scsibus->scsi_bsy_r() ? 0 : HDC_BSY_MASK);
2425   state->m_nimbus_drives.reg410_in |= (state->m_scsibus->scsi_msg_r() ? 0 : HDC_MSG_MASK);
24262426
24272427   state->m_nimbus_drives.drq_ff=0;
24282428}
r18430r18431
24382438
24392439   state->m_nimbus_drives.reg410_out=data;
24402440
2441   state->m_scsibus->scsi_rst_w((data & HDC_RESET_MASK) ? 0 : 1);
2442   state->m_scsibus->scsi_sel_w((data & HDC_SEL_MASK) ? 0 : 1);
2441   state->m_scsibus->scsi_rst_w((data & HDC_RESET_MASK) ? 1 : 0);
2442   state->m_scsibus->scsi_sel_w((data & HDC_SEL_MASK) ? 1 : 0);
24432443}
24442444
24452445static void hdc_post_rw(running_machine &machine)
r18430r18431
24472447   rmnimbus_state *state = machine.driver_data<rmnimbus_state>();
24482448
24492449   if((state->m_nimbus_drives.reg410_in & HDC_REQ_MASK)==0)
2450      state->m_scsibus->scsi_ack_w(0);
2450      state->m_scsibus->scsi_ack_w(1);
24512451
24522452   state->m_nimbus_drives.drq_ff=0;
24532453}
r18430r18431
24922492
24932493   last=m_nimbus_drives.reg410_in & mask;
24942494
2495   if(state)
2495   if(!state)
24962496      m_nimbus_drives.reg410_in|=mask;
24972497   else
24982498      m_nimbus_drives.reg410_in&=~mask;
r18430r18431
25062506   switch( mask )
25072507   {
25082508   case HDC_REQ_MASK:
2509      if (state==0)
2509      if (state)
25102510      {
25112511         if(((m_nimbus_drives.reg410_in & HDC_CD_MASK)==HDC_CD_MASK) && (last!=0))
25122512         {
r18430r18431
25162516      }
25172517      else
25182518      {
2519         m_scsibus->scsi_ack_w(1);
2519         m_scsibus->scsi_ack_w(0);
25202520      }
25212521      break;
25222522
25232523   case HDC_IO_MASK:
2524      if (state==0)
2524      if (state)
25252525      {
25262526         printf( "switch to input mode\n" );
2527         m_scsibus->scsi_data_w(0xff);
2527         m_scsibus->scsi_data_w(0);
25282528      }
25292529      break;
25302530   }
trunk/src/mess/machine/e01.c
r18430r18431
266266
267267WRITE_LINE_MEMBER( e01_device::scsi_bsy_w )
268268{
269   if (!state)
269   if (state)
270270   {
271      m_scsibus->scsi_sel_w(1);
271      m_scsibus->scsi_sel_w(0);
272272   }
273273}
274274
275275WRITE_LINE_MEMBER( e01_device::scsi_req_w )
276276{
277   if (state)
277   if (!state)
278278   {
279      m_scsibus->scsi_ack_w(1);
279      m_scsibus->scsi_ack_w(0);
280280   }
281281
282282   m_hdc_irq = !state;
r18430r18431
692692{
693693   UINT8 data = m_scsibus->scsi_data_r(space, 0);
694694
695   m_scsibus->scsi_ack_w(0);
695   m_scsibus->scsi_ack_w(1);
696696
697697   return data;
698698}
r18430r18431
706706{
707707   m_scsibus->scsi_data_w(space, 0, data);
708708
709   m_scsibus->scsi_ack_w(0);
709   m_scsibus->scsi_ack_w(1);
710710}
711711
712712
r18430r18431
734734   UINT8 data = 0;
735735
736736   // SCSI bus
737   data |= !m_scsibus->scsi_msg_r();
738   data |= !m_scsibus->scsi_bsy_r() << 1;
739   data |= !m_scsibus->scsi_req_r() << 5;
740   data |= !m_scsibus->scsi_io_r() << 6;
741   data |= !m_scsibus->scsi_cd_r() << 7;
737   data |= m_scsibus->scsi_msg_r();
738   data |= m_scsibus->scsi_bsy_r() << 1;
739   data |= m_scsibus->scsi_req_r() << 5;
740   data |= m_scsibus->scsi_io_r() << 6;
741   data |= m_scsibus->scsi_cd_r() << 7;
742742
743743   // TODO NIRQ
744744
r18430r18431
752752
753753WRITE8_MEMBER( e01_device::hdc_select_w )
754754{
755   m_scsibus->scsi_sel_w(0);
755   m_scsibus->scsi_sel_w(1);
756756}
757757
758758
trunk/src/mess/machine/d9060.c
r18430r18431
143143
144144WRITE_LINE_MEMBER( base_d9060_device::req_w )
145145{
146   m_via->write_ca1(!state);
146   m_via->write_ca1(state);
147147}
148148
149149static const SCSICB_interface sasi_intf =
r18430r18431
377377
378378   UINT8 data = 0;
379379
380   data |= !m_sasibus->scsi_cd_r() << 2;
381   data |= !m_sasibus->scsi_bsy_r() << 3;
382   data |= !m_sasibus->scsi_io_r() << 6;
383   data |= !m_sasibus->scsi_msg_r() << 7;
380   data |= m_sasibus->scsi_cd_r() << 2;
381   data |= m_sasibus->scsi_bsy_r() << 3;
382   data |= m_sasibus->scsi_io_r() << 6;
383   data |= m_sasibus->scsi_msg_r() << 7;
384384
385385   // drive type
386386   data |= (m_variant == TYPE_9060) << 4;
r18430r18431
405405
406406    */
407407
408   m_sasibus->scsi_sel_w(!BIT(data, 0));
409   m_sasibus->scsi_rst_w(!BIT(data, 1));
408   m_sasibus->scsi_sel_w(BIT(data, 0));
409   m_sasibus->scsi_rst_w(BIT(data, 1));
410410}
411411
412412READ_LINE_MEMBER( base_d9060_device::req_r )
413413{
414   return !m_sasibus->scsi_req_r();
414   return m_sasibus->scsi_req_r();
415415}
416416
417417WRITE_LINE_MEMBER( base_d9060_device::ack_w )
418418{
419   m_sasibus->scsi_ack_w(state);
419   m_sasibus->scsi_ack_w(!state);
420420}
421421
422422WRITE_LINE_MEMBER( base_d9060_device::enable_w )
423423{
424424   m_enable = state;
425
426   if( !m_enable )
427   {
428      m_sasibus->scsi_data_w( m_data );
429   }
430   else
431   {
432      m_sasibus->scsi_data_w( 0 );
433   }
425434}
426435
436WRITE8_MEMBER( base_d9060_device::scsi_data_w )
437{
438   m_data = data;
439
440   if( !m_enable )
441   {
442      m_sasibus->scsi_data_w( m_data );
443   }
444}
445
427446static const via6522_interface via_intf =
428447{
429448   DEVCB_DEVICE_MEMBER(SASIBUS_TAG ":host", scsicb_device, scsi_data_r),
r18430r18431
433452   DEVCB_NULL,
434453   DEVCB_NULL,
435454
436   DEVCB_DEVICE_MEMBER(SASIBUS_TAG ":host", scsicb_device, scsi_data_w),
455   DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, base_d9060_device, scsi_data_w),
437456   DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, base_d9060_device, via_pb_w),
438457   DEVCB_NULL,
439458   DEVCB_NULL,
r18430r18431
520539     m_rfdo(1),
521540     m_daco(1),
522541     m_atna(1),
523     m_enable(1),
542     m_enable(0),
524543     m_variant(variant)
525544{
526545}
trunk/src/mess/machine/d9060.h
r18430r18431
7171   DECLARE_READ_LINE_MEMBER( req_r );
7272   DECLARE_WRITE_LINE_MEMBER( ack_w );
7373   DECLARE_WRITE_LINE_MEMBER( enable_w );
74   DECLARE_WRITE8_MEMBER( scsi_data_w );
7475
7576protected:
7677    // device-level overrides
r18430r18431
99100
100101   // SASI bus
101102   int m_enable;
103   UINT8 m_data;
102104
103105   int m_variant;
104106};
trunk/src/mess/drivers/bullet.c
r18430r18431
482482{
483483   UINT8 data = m_scsibus->scsi_data_r();
484484
485   m_scsibus->scsi_ack_w(0);
485   m_scsibus->scsi_ack_w(1);
486486
487487   m_wack = 0;
488488   update_dma_rdy();
r18430r18431
499499{
500500   m_scsibus->scsi_data_w(data);
501501
502   m_scsibus->scsi_ack_w(0);
502   m_scsibus->scsi_ack_w(1);
503503
504504   m_wack = 0;
505505   update_dma_rdy();
r18430r18431
928928
929929   UINT8 data = 0;
930930
931   data |= !m_scsibus->scsi_bsy_r() << 3;
932   data |= !m_scsibus->scsi_msg_r() << 4;
933   data |= !m_scsibus->scsi_cd_r() << 5;
934   data |= !m_scsibus->scsi_req_r() << 6;
935   data |= !m_scsibus->scsi_io_r() << 7;
931   data |= m_scsibus->scsi_bsy_r() << 3;
932   data |= m_scsibus->scsi_msg_r() << 4;
933   data |= m_scsibus->scsi_cd_r() << 5;
934   data |= m_scsibus->scsi_req_r() << 6;
935   data |= m_scsibus->scsi_io_r() << 7;
936936
937937   return data;
938938}
r18430r18431
954954
955955    */
956956
957   //m_scsibus->scsi_atn_w(!BIT(data, 0));
958   m_scsibus->scsi_rst_w(!BIT(data, 1));
959   m_scsibus->scsi_sel_w(!BIT(data, 2));
957   m_scsibus->scsi_atn_w(BIT(data, 0));
958   m_scsibus->scsi_rst_w(BIT(data, 1));
959   m_scsibus->scsi_sel_w(BIT(data, 2));
960960}
961961
962962WRITE_LINE_MEMBER( bulletf_state::cstrb_w )
r18430r18431
10271027
10281028WRITE_LINE_MEMBER( bulletf_state::req_w )
10291029{
1030   if (state)
1030   if (!state)
10311031   {
1032      m_scsibus->scsi_ack_w(1);
1032      m_scsibus->scsi_ack_w(0);
10331033
10341034      m_wack = 1;
10351035   }
trunk/src/mess/drivers/v1050.c
r18430r18431
349349{
350350   data_out = data;
351351
352   if( m_sasibus->scsi_io_r() != 0 )
352   if( !m_sasibus->scsi_io_r() )
353353   {
354354      m_sasibus->scsi_data_w( data );
355355   }
r18430r18431
357357
358358WRITE_LINE_MEMBER( v1050_state::sasi_io_w )
359359{
360   if( state != 0 )
360   if( !state )
361361   {
362362      m_sasibus->scsi_data_w( data_out );
363363   }
364364   else
365365   {
366      m_sasibus->scsi_data_w( 0xff );
366      m_sasibus->scsi_data_w( 0 );
367367   }
368368}
369369
r18430r18431
386386
387387   UINT8 data = 0;
388388
389   data |= m_sasibus->scsi_req_r();
390   data |= !m_sasibus->scsi_bsy_r() << 1;
391   data |= !m_sasibus->scsi_msg_r() << 2;
392   data |= !m_sasibus->scsi_cd_r() << 3;
393   data |= m_sasibus->scsi_io_r() << 4;
389   data |= !m_sasibus->scsi_req_r();
390   data |= m_sasibus->scsi_bsy_r() << 1;
391   data |= m_sasibus->scsi_msg_r() << 2;
392   data |= m_sasibus->scsi_cd_r() << 3;
393   data |= !m_sasibus->scsi_io_r() << 4;
394394
395395   return data;
396396}
397397
398398TIMER_DEVICE_CALLBACK_MEMBER(v1050_state::sasi_ack_tick)
399399{
400   m_sasibus->scsi_ack_w(1);
400   m_sasibus->scsi_ack_w(0);
401401}
402402
403403TIMER_DEVICE_CALLBACK_MEMBER(v1050_state::sasi_rst_tick)
404404{
405   m_sasibus->scsi_rst_w(1);
405   m_sasibus->scsi_rst_w(0);
406406}
407407
408408WRITE8_MEMBER( v1050_state::sasi_ctrl_w )
r18430r18431
422422
423423    */
424424
425   m_sasibus->scsi_sel_w(!BIT(data, 0));
425   m_sasibus->scsi_sel_w(BIT(data, 0));
426426
427427   if (BIT(data, 1))
428428   {
429429      // send acknowledge pulse
430      m_sasibus->scsi_ack_w(0);
430      m_sasibus->scsi_ack_w(1);
431431
432432      m_timer_ack->adjust(attotime::from_nsec(100));
433433   }
r18430r18431
435435   if (BIT(data, 7))
436436   {
437437      // send reset pulse
438      m_sasibus->scsi_rst_w(0);
438      m_sasibus->scsi_rst_w(1);
439439
440440      m_timer_rst->adjust(attotime::from_nsec(100));
441441   }

Previous 199869 Revisions Next


© 1997-2024 The MAME Team