r7249 Wednesday 3rd February, 2010 at 14:18:29 UTC by Curt Coder
[C8050] Fixed stepper motor phases.
[src/mess/machine]c2040.c

src/mess/machine/c2040.c
r7248r7249
646646    via6522_interface via_intf um3
647647-------------------------------------------------*/
648648
649static void read_current_track(c2040_t *c2040, int unit)
650{
651   c2040->unit[unit].track_len = G64_BUFFER_SIZE;
652   c2040->unit[unit].buffer_pos = G64_DATA_START;
653   c2040->unit[unit].bit_pos = 7;
654   c2040->bit_count = 0;
655
656   /* read track data */
657   floppy_drive_read_track_data_info_buffer(c2040->unit[unit].image, c2040->side, c2040->unit[unit].track_buffer, &c2040->unit[unit].track_len);
658
659   /* extract track length */
660   c2040->unit[unit].track_len = G64_DATA_START + ((c2040->unit[unit].track_buffer[1] << 8) | c2040->unit[unit].track_buffer[0]);
661}
662
663static void step_motor(c2040_t *c2040, int unit, int stp)
664{
665   if (c2040->unit[unit].stp != stp)
666   {
667      int tracks = 0;
668
669      switch (c2040->unit[unit].stp)
670      {
671      case 0:   if (stp == 1) tracks++; else if (stp == 3) tracks--; break;
672      case 1:   if (stp == 2) tracks++; else if (stp == 0) tracks--; break;
673      case 2: if (stp == 3) tracks++; else if (stp == 1) tracks--; break;
674      case 3: if (stp == 0) tracks++; else if (stp == 2) tracks--; break;
675      }
676
677      if (tracks != 0)
678      {
679         /* step read/write head */
680         floppy_drive_seek(c2040->unit[unit].image, tracks);
681
682         /* read new track data */
683         read_current_track(c2040, unit);
684      }
685
686      c2040->unit[unit].stp = stp;
687   }
688}
689
649690static READ8_DEVICE_HANDLER( via_pa_r )
650691{
651692   /*
r7248r7249
692733   return 0;
693734}
694735
695static void step_motor(c2040_t *c2040, int unit, int stp)
696{
697   if (c2040->unit[unit].stp != stp)
698   {
699      int tracks = 0;
700
701      switch (c2040->unit[unit].stp)
702      {
703      case 0:   if (stp == 1) tracks++; else if (stp == 3) tracks--; break;
704      case 1:   if (stp == 2) tracks++; else if (stp == 0) tracks--; break;
705      case 2: if (stp == 3) tracks++; else if (stp == 1) tracks--; break;
706      case 3: if (stp == 0) tracks++; else if (stp == 2) tracks--; break;
707      }
708
709      if (tracks != 0)
710      {
711         c2040->unit[unit].track_len = G64_BUFFER_SIZE;
712         c2040->unit[unit].buffer_pos = G64_DATA_START;
713         c2040->unit[unit].bit_pos = 7;
714         c2040->bit_count = 0;
715
716         /* step read/write head */
717         floppy_drive_seek(c2040->unit[unit].image, tracks);
718
719         /* read track data */
720         floppy_drive_read_track_data_info_buffer(c2040->unit[unit].image, c2040->side, c2040->unit[unit].track_buffer, &c2040->unit[unit].track_len);
721
722         /* extract track length */
723         c2040->unit[unit].track_len = G64_DATA_START + ((c2040->unit[unit].track_buffer[1] << 8) | c2040->unit[unit].track_buffer[0]);
724      }
725
726      c2040->unit[unit].stp = stp;
727   }
728}
729
730736static WRITE8_DEVICE_HANDLER( via_pb_w )
731737{
732738   /*
r7248r7249
824830    via6522_interface c8050_via_intf um3
825831-------------------------------------------------*/
826832
833static void c8050_step_motor(c2040_t *c2040, int unit, int stp)
834{
835   if (c2040->unit[unit].stp != stp)
836   {
837      int tracks = 0;
838
839      switch (c2040->unit[unit].stp)
840      {
841      case 0:   if (stp == 1) tracks++; else if (stp == 2) tracks--; break;
842      case 1:   if (stp == 3) tracks++; else if (stp == 0) tracks--; break;
843      case 2: if (stp == 0) tracks++; else if (stp == 3) tracks--; break;
844      case 3: if (stp == 2) tracks++; else if (stp == 1) tracks--; break;
845      }
846
847      if (tracks != 0)
848      {
849         /* step read/write head */
850         floppy_drive_seek(c2040->unit[unit].image, tracks);
851
852         /* read new track data */
853         read_current_track(c2040, unit);
854      }
855
856      c2040->unit[unit].stp = stp;
857   }
858}
859
827860static READ8_DEVICE_HANDLER( c8050_via_pb_r )
828861{
829862   /*
r7248r7249
868901
869902    */
870903
871   via_pb_w(device, offset, data);
904   c2040_t *c2040 = get_safe_token(device->owner);
872905
906   /* stepper motor 1 */
907   int s1 = data & 0x03;
908   c8050_step_motor(c2040, 1, s1);
909
910   /* stepper motor 0 */
911   int s0 = (data >> 2) & 0x03;
912   c8050_step_motor(c2040, 0, s0);
913
914   /* spindle motor 1 */
915   int mtr1 = BIT(data, 4);
916   floppy_mon_w(c2040->unit[1].image, !mtr1);
917
918   /* spindle motor 0 */
919   int mtr0 = BIT(data, 5);
920   floppy_mon_w(c2040->unit[0].image, !mtr0);
921
922   timer_enable(c2040->bit_timer, mtr1 | mtr0);
923
873924   /* TODO pull sync */
874925}
875926

Previous 509076 RevisionsNext 50


© 1998-2010 The MESS Team