r7261 Thursday 4th February, 2010 at 14:44:14 UTC by Curt Coder
CBM drives cleanup.
[src/mess/machine]c1541.c c1551.c c1571.c c2040.c

src/mess/machine/c2040.c
r7260r7261
6565typedef struct _c2040_unit_t c2040_unit_t;
6666struct _c2040_unit_t
6767{
68   /* motors */
6869   int stp;                        /* stepper motor phase */
6970   int mtr;                        /* spindle motor on */
7071
r7260r7261
8788   int side;                     /* selected side */
8889
8990   /* IEEE-488 bus */
90   int address;                  /* bus address - 8 */
91   int address;                  /* device address - 8 */
9192   int rfdo;                     /* not ready for data output */
9293   int daco;                     /* not data accepted output */
9394   int atna;                     /* attention acknowledge */
src/mess/machine/c1541.c
r7260r7261
165165typedef struct _c1541_t c1541_t;
166166struct _c1541_t
167167{
168   /* abstractions */
169   int address;                  /* serial bus address - 8 */
170   UINT8 track_buffer[G64_BUFFER_SIZE];            /* track data buffer */
171   int track_len;                  /* track length */
172   int buffer_pos;                  /* current byte position within track buffer */
173   int bit_pos;                  /* current bit position within track buffer byte */
174   int bit_count;                  /* current data byte bit counter */
175   UINT16 data;                  /* data shift register */
168   /* IEC bus */
169   int address;                     /* device address - 8 */
170   int atna;                        /* attention acknowledge */
171   int data_out;                     /* serial bus data output */
176172
173   /* IEEE-488 bus */
174   int nrfd_out;                     /* not ready for data */
175   int ndac_out;                     /* not data accepted */
176
177   /* motors */
178   int stp;                        /* stepper motor phase */
179   int mtr;                        /* spindle motor on */
180   
181   /* track */
182   UINT8 track_buffer[G64_BUFFER_SIZE];   /* track data buffer */
183   int track_len;                     /* track length */
184   int buffer_pos;                     /* current byte position within track buffer */
185   int bit_pos;                     /* current bit position within track buffer byte */
186   int bit_count;                     /* current data byte bit counter */
187   UINT16 data;                     /* data shift register */
188   UINT8 yb;                        /* GCR data byte to write */
189
177190   /* signals */
178   UINT8 yb;                     /* GCR data byte to write */
179   int byte;                     /* byte ready */
180   int atna;                     /* attention acknowledge */
181   int ds;                        /* density select */
182   int stp;                     /* stepping motor */
183   int soe;                     /* s? output enable */
184   int mode;                     /* mode (0 = write, 1 = read) */
185   int via0_irq;                  /* VIA #0 interrupt request */
186   int via1_irq;                  /* VIA #1 interrupt request */
191   int ds;                           /* density select */
192   int soe;                        /* s? output enable */
193   int byte;                        /* byte ready */
194   int mode;                        /* mode (0 = write, 1 = read) */
187195
188   /* serial bus */
189   int data_out;                  /* serial bus data output */
196   /* interrupts */
197   int via0_irq;                     /* VIA #0 interrupt request */
198   int via1_irq;                     /* VIA #1 interrupt request */
190199
191   /* IEEE-488 bus */
192   int nrfd_out;                  /* not ready for data */
193   int ndac_out;                  /* not data accepted */
194
195200   /* devices */
196201   running_device *cpu;
197202   running_device *via0;
r7260r7261
732737    via6522_interface c1541_via1_intf
733738-------------------------------------------------*/
734739
740static void read_current_track(c1541_t *c1541)
741{
742   c1541->track_len = G64_BUFFER_SIZE;
743   c1541->buffer_pos = G64_DATA_START;
744   c1541->bit_pos = 7;
745   c1541->bit_count = 0;
746
747   /* read track data */
748   floppy_drive_read_track_data_info_buffer(c1541->image, 0, c1541->track_buffer, &c1541->track_len);
749
750   /* extract track length */
751   c1541->track_len = G64_DATA_START + ((c1541->track_buffer[1] << 8) | c1541->track_buffer[0]);
752}
753
754static void spindle_motor(c1541_t *c1541, int mtr)
755{
756   if (c1541->mtr != mtr)
757   {
758      if (mtr)
759      {
760         /* read track data */
761         read_current_track(c1541);
762      }
763
764      floppy_mon_w(c1541->image, !mtr);
765      timer_enable(c1541->bit_timer, mtr);
766
767      c1541->mtr = mtr;
768   }
769}
770
771static void step_motor(c1541_t *c1541, int stp)
772{
773   if (c1541->stp != stp)
774   {
775      int tracks = 0;
776
777      switch (c1541->stp)
778      {
779      case 0:   if (stp == 1) tracks++; else if (stp == 3) tracks--; break;
780      case 1:   if (stp == 2) tracks++; else if (stp == 0) tracks--; break;
781      case 2: if (stp == 3) tracks++; else if (stp == 1) tracks--; break;
782      case 3: if (stp == 0) tracks++; else if (stp == 2) tracks--; break;
783      }
784
785      if (tracks != 0)
786      {
787         /* step read/write head */
788         floppy_drive_seek(c1541->image, tracks);
789
790         /* read new track data */
791         read_current_track(c1541);
792      }
793
794      c1541->stp = stp;
795   }
796}
797
735798static WRITE_LINE_DEVICE_HANDLER( via1_irq_w )
736799{
737800   c1541_t *c1541 = get_safe_token(device->owner);
r7260r7261
833896
834897   c1541_t *c1541 = get_safe_token(device->owner);
835898
899   /* stepper motor */
836900   int stp = data & 0x03;
837   int ds = (data >> 5) & 0x03;
838   int mtr = BIT(data, 2);
901   step_motor(c1541, stp);
839902
840   /* stepper motor */
841   if (c1541->stp != stp)
842   {
843      int tracks = 0;
844
845      switch (c1541->stp)
846      {
847      case 0:   if (stp == 1) tracks++; else if (stp == 3) tracks--; break;
848      case 1:   if (stp == 2) tracks++; else if (stp == 0) tracks--; break;
849      case 2: if (stp == 3) tracks++; else if (stp == 1) tracks--; break;
850      case 3: if (stp == 0) tracks++; else if (stp == 2) tracks--; break;
851      }
852
853      if (tracks != 0)
854      {
855         c1541->track_len = G64_BUFFER_SIZE;
856         c1541->buffer_pos = G64_DATA_START;
857         c1541->bit_pos = 7;
858         c1541->bit_count = 0;
859
860         /* step read/write head */
861         floppy_drive_seek(c1541->image, tracks);
862
863         /* read track data */
864         floppy_drive_read_track_data_info_buffer(c1541->image, 0, c1541->track_buffer, &c1541->track_len);
865
866         /* extract track length */
867         c1541->track_len = G64_DATA_START + ((c1541->track_buffer[1] << 8) | c1541->track_buffer[0]);
868      }
869
870      c1541->stp = stp;
871   }
872
873903   /* spindle motor */
874   floppy_mon_w(c1541->image, !mtr);
875   timer_enable(c1541->bit_timer, mtr);
904   int mtr = BIT(data, 2);
905   spindle_motor(c1541, mtr);
876906
877907   /* activity LED */
878908
879909   /* density select */
910   int ds = (data >> 5) & 0x03;
911
880912   if (c1541->ds != ds)
881913   {
882914      timer_adjust_periodic(c1541->bit_timer, attotime_zero, 0, ATTOTIME_IN_HZ(C2040_BITRATE[ds]/4));
src/mess/machine/c1551.c
r7260r7261
4444typedef struct _c1551_t c1551_t;
4545struct _c1551_t
4646{
47   UINT8 track_buffer[G64_BUFFER_SIZE];            /* track data buffer */
48   int track_len;                  /* track length */
49   int buffer_pos;                  /* current byte position within track buffer */
50   int bit_pos;                  /* current bit position within track buffer byte */
51   int bit_count;                  /* current data byte bit counter */
52   UINT16 data;                  /* data shift register */
47   /* motors */
48   int stp;                        /* stepper motor phase */
49   int mtr;                        /* spindle motor on */
50   
51   /* track */
52   UINT8 track_buffer[G64_BUFFER_SIZE];   /* track data buffer */
53   int track_len;                     /* track length */
54   int buffer_pos;                     /* current byte position within track buffer */
55   int bit_pos;                     /* current bit position within track buffer byte */
56   int bit_count;                     /* current data byte bit counter */
57   UINT16 data;                     /* data shift register */
58   UINT8 yb;                        /* GCR data byte to write */
5359
5460   /* signals */
55   UINT8 yb;                     /* GCR data byte to write */
56   int byte;                     /* byte ready */
57   int atna;                     /* attention acknowledge */
58   int ds;                        /* density select */
59   int stp;                     /* stepping motor */
60   int soe;                     /* s? output enable */
61   int mode;                     /* mode (0 = write, 1 = read) */
61   int ds;                           /* density select */
62   int soe;                        /* s? output enable */
63   int byte;                        /* byte ready */
64   int mode;                        /* mode (0 = write, 1 = read) */
6265
6366   /* devices */
6467   running_device *cpu;
r7260r7261
140143    c1551_port_r - M6510T port read
141144-------------------------------------------------*/
142145
146static void read_current_track(c1551_t *c1551)
147{
148   c1551->track_len = G64_BUFFER_SIZE;
149   c1551->buffer_pos = G64_DATA_START;
150   c1551->bit_pos = 7;
151   c1551->bit_count = 0;
152
153   /* read track data */
154   floppy_drive_read_track_data_info_buffer(c1551->image, 0, c1551->track_buffer, &c1551->track_len);
155
156   /* extract track length */
157   c1551->track_len = G64_DATA_START + ((c1551->track_buffer[1] << 8) | c1551->track_buffer[0]);
158}
159
160static void spindle_motor(c1551_t *c1551, int mtr)
161{
162   if (c1551->mtr != mtr)
163   {
164      if (mtr)
165      {
166         /* read track data */
167         read_current_track(c1551);
168      }
169
170      floppy_mon_w(c1551->image, !mtr);
171      timer_enable(c1551->bit_timer, mtr);
172
173      c1551->mtr = mtr;
174   }
175}
176
177static void step_motor(c1551_t *c1551, int stp)
178{
179   if (c1551->stp != stp)
180   {
181      int tracks = 0;
182
183      switch (c1551->stp)
184      {
185      case 0:   if (stp == 1) tracks++; else if (stp == 3) tracks--; break;
186      case 1:   if (stp == 2) tracks++; else if (stp == 0) tracks--; break;
187      case 2: if (stp == 3) tracks++; else if (stp == 1) tracks--; break;
188      case 3: if (stp == 0) tracks++; else if (stp == 2) tracks--; break;
189      }
190
191      if (tracks != 0)
192      {
193         /* step read/write head */
194         floppy_drive_seek(c1551->image, tracks);
195
196         /* read new track data */
197         read_current_track(c1551);
198      }
199
200      c1551->stp = stp;
201   }
202}
203
143204static READ8_DEVICE_HANDLER( c1551_port_r )
144205{
145206   /*
146207
147208        bit     description
148209
149        P0      STEP0
150        P1      STEP1
151        P2      MOTOR ON
152        P3      ACT
153        P4      WPRT
210        P0      STP0A
211        P1      STP0B
212        P2      MTR0
213        P3      ACT0
214        P4      WPS
154215        P5      DS0
155216        P6      DS1
156        P7      BYTE READY
217        P7      BYTE LTCHED
157218
158219    */
159220
r7260r7261
163224   /* write protect sense */
164225   data |= !floppy_wpt_r(c1551->image) << 4;
165226   
166   /* byte ready */
227   /* byte latched */
167228   data |= !(c1551->soe && c1551->byte) << 7;
168229
169230   return data;
r7260r7261
179240
180241        bit     description
181242
182        P0      STEP0
183        P1      STEP1
184        P2      MOTOR ON
185        P3      ACT
186        P4      WPRT
243        P0      STP0A
244        P1      STP0B
245        P2      MTR0
246        P3      ACT0
247        P4      WPS
187248        P5      DS0
188249        P6      DS1
189        P7      BYTE READY
250        P7      BYTE LTCHED
190251
191252    */
192253
193254   c1551_t *c1551 = get_safe_token(device->owner);
194255
256   /* stepper motor */
195257   int stp = data & 0x03;
196   int ds = (data >> 5) & 0x03;
197   int mtr = BIT(data, 2);
258   step_motor(c1551, stp);
198259
199   /* stepper motor */
200   if (c1551->stp != stp)
201   {
202      int tracks = 0;
203
204      switch (c1551->stp)
205      {
206      case 0:   if (stp == 1) tracks++; else if (stp == 3) tracks--; break;
207      case 1:   if (stp == 2) tracks++; else if (stp == 0) tracks--; break;
208      case 2: if (stp == 3) tracks++; else if (stp == 1) tracks--; break;
209      case 3: if (stp == 0) tracks++; else if (stp == 2) tracks--; break;
210      }
211
212      if (tracks != 0)
213      {
214         c1551->track_len = G64_BUFFER_SIZE;
215         c1551->buffer_pos = G64_DATA_START;
216         c1551->bit_pos = 7;
217         c1551->bit_count = 0;
218
219         /* step read/write head */
220         floppy_drive_seek(c1551->image, tracks);
221
222         /* read track data */
223         floppy_drive_read_track_data_info_buffer(c1551->image, 0, c1551->track_buffer, &c1551->track_len);
224
225         /* extract track length */
226         c1551->track_len = G64_DATA_START + ((c1551->track_buffer[1] << 8) | c1551->track_buffer[0]);
227      }
228
229      c1551->stp = stp;
230   }
231
232260   /* spindle motor */
233   floppy_mon_w(c1551->image, !mtr);
234   timer_enable(c1551->bit_timer, mtr);
261   int mtr = BIT(data, 2);
262   spindle_motor(c1551, mtr);
235263
236264   /* activity LED */
237265
238266   /* density select */
267   int ds = (data >> 5) & 0x03;
268
239269   if (c1551->ds != ds)
240270   {
241271      timer_adjust_periodic(c1551->bit_timer, attotime_zero, 0, ATTOTIME_IN_HZ(C2040_BITRATE[ds]/4));
r7260r7261
264294
265295        bit     description
266296
267        PA0     6523 P0
268        PA1     6523 P1
269        PA2     6523 P2
270        PA3     6523 P3
271        PA4     6523 P4
272        PA5     6523 P5
273        PA6     6523 P6
274        PA7     6523 P7
297        PA0     TCBM PA0
298        PA1     TCBM PA1
299        PA2     TCBM PA2
300        PA3     TCBM PA3
301        PA4     TCBM PA4
302        PA5     TCBM PA5
303        PA6     TCBM PA6
304        PA7     TCBM PA7
275305
276306    */
277307
r7260r7261
284314
285315        bit     description
286316
287        PA0     6523 P0
288        PA1     6523 P1
289        PA2     6523 P2
290        PA3     6523 P3
291        PA4     6523 P4
292        PA5     6523 P5
293        PA6     6523 P6
294        PA7     6523 P7
317        PA0     TCBM PA0
318        PA1     TCBM PA1
319        PA2     TCBM PA2
320        PA3     TCBM PA3
321        PA4     TCBM PA4
322        PA5     TCBM PA5
323        PA6     TCBM PA6
324        PA7     TCBM PA7
295325
296326    */
297327}
r7260r7261
346376
347377        bit     description
348378
349        PC0     6523 _IRQ
350        PC1     6523 _RES
351        PC2     interface J1
352        PC3     6523 pin 20
353        PC4     SOE
379        PC0     TCBM STATUS0
380        PC1     TCBM STATUS1
381        PC2     TCBM DEV
382        PC3     TCBM ACK
383        PC4     MODE
354384        PC5     JP1
355385        PC6     _SYNC
356        PC7     6523 phi2
386        PC7     TCBM DAV
357387
358388    */
359389
r7260r7261
372402
373403        bit     description
374404
375        PC0     6523 _IRQ
376        PC1     6523 _RES
377        PC2     interface J1
378        PC3     6523 pin 20
379        PC4     SOE
405        PC0     TCBM STATUS0
406        PC1     TCBM STATUS1
407        PC2     TCBM DEV
408        PC3     TCBM ACK
409        PC4     MODE
380410        PC5     JP1
381411        PC6     _SYNC
382        PC7     6523 phi2
412        PC7     TCBM DAV
383413
384414    */
385415
r7260r7261
445475    ROM( c1551 )
446476-------------------------------------------------*/
447477
448ROM_START( c1551 )
478ROM_START( c1551 ) // schematic 251860
449479   ROM_REGION( 0x4000, "c1551", ROMREGION_LOADBYNAME )
450480   ROM_LOAD( "318001-01.u4", 0x0000, 0x4000, CRC(6d16d024) SHA1(fae3c788ad9a6cc2dbdfbcf6c0264b2ca921d55e) )
451481ROM_END
r7260r7261
481511   state_save_register_device_item(device, 0, c1551->data);
482512   state_save_register_device_item(device, 0, c1551->yb);
483513   state_save_register_device_item(device, 0, c1551->byte);
484   state_save_register_device_item(device, 0, c1551->atna);
485514   state_save_register_device_item(device, 0, c1551->ds);
486515   state_save_register_device_item(device, 0, c1551->stp);
487516   state_save_register_device_item(device, 0, c1551->soe);
src/mess/machine/c1571.c
r7260r7261
5050typedef struct _c1571_t c1571_t;
5151struct _c1571_t
5252{
53   /* abstractions */
54   int address;                  /* device number */
55   UINT8 track_buffer[G64_BUFFER_SIZE];            /* track data buffer */
56   int track_len;                  /* track length */
57   int buffer_pos;                  /* current byte position within track buffer */
58   int bit_pos;                  /* current bit position within track buffer byte */
59   int bit_count;                  /* current data byte bit counter */
60   UINT16 data;                  /* data shift register */
53   /* IEC bus */
54   int address;                     /* device number */
55   int data_out;                     /* serial data out */
56   int atn_ack;                     /* attention acknowledge */
57   int ser_dir;                     /* fast serial direction */
58   int sp_out;                        /* fast serial data out */
59   int cnt_out;                     /* fast serial clock out */
6160
61   /* motors */
62   int stp;                        /* stepper motor phase */
63   int mtr;                        /* spindle motor on */
64
65   /* track */
66   UINT8 track_buffer[G64_BUFFER_SIZE];   /* track data buffer */
67   int track_len;                     /* track length */
68   int buffer_pos;                     /* current byte position within track buffer */
69   int bit_pos;                     /* current bit position within track buffer byte */
70   int bit_count;                     /* current data byte bit counter */
71   UINT16 data;                     /* data shift register */
72   UINT8 yb;                        /* GCR data byte to write */
73
6274   /* signals */
63   UINT8 yb;                     /* GCR data byte to write */
64   int byte;                     /* byte ready */
65   int atna;                     /* attention acknowledge */
66   int ds;                        /* density select */
67   int stp;                     /* stepping motor */
68   int soe;                     /* s? output enable */
69   int mode;                     /* mode (0 = write, 1 = read) */
70   int side;                     /* disk side select */
75   int ds;                           /* density select */
76   int soe;                        /* s? output enable */
77   int byte;                        /* byte ready */
78   int mode;                        /* mode (0 = write, 1 = read) */
79   int side;                        /* disk side select */
7180
72   int data_out;                  /* serial data out */
73   int atn_ack;                  /* attention acknowledge */
74   int ser_dir;                  /* fast serial direction */
75   int sp_out;                     /* fast serial data out */
76   int cnt_out;                  /* fast serial clock out */
77
7881   /* interrupts */
79   int via0_irq;                  /* VIA #0 interrupt request */
80   int via1_irq;                  /* VIA #1 interrupt request */
81   int cia_irq;                  /* CIA interrupt request */
82   int via0_irq;                     /* VIA #0 interrupt request */
83   int via1_irq;                     /* VIA #1 interrupt request */
84   int cia_irq;                     /* CIA interrupt request */
8285
8386   /* devices */
8487   running_device *cpu;
r7260r7261
462465    via6522_interface c1571_via1_intf
463466-------------------------------------------------*/
464467
468static void read_current_track(c1571_t *c1571)
469{
470   c1571->track_len = G64_BUFFER_SIZE;
471   c1571->buffer_pos = G64_DATA_START;
472   c1571->bit_pos = 7;
473   c1571->bit_count = 0;
474
475   /* read track data */
476   floppy_drive_read_track_data_info_buffer(c1571->image, c1571->side, c1571->track_buffer, &c1571->track_len);
477
478   /* extract track length */
479   c1571->track_len = G64_DATA_START + ((c1571->track_buffer[1] << 8) | c1571->track_buffer[0]);
480}
481
482static void spindle_motor(c1571_t *c1571, int mtr)
483{
484   if (c1571->mtr != mtr)
485   {
486      if (mtr)
487      {
488         /* read track data */
489         read_current_track(c1571);
490      }
491
492      floppy_mon_w(c1571->image, !mtr);
493      timer_enable(c1571->bit_timer, mtr);
494
495      c1571->mtr = mtr;
496   }
497}
498
499static void step_motor(c1571_t *c1571, int stp)
500{
501   if (c1571->stp != stp)
502   {
503      int tracks = 0;
504
505      switch (c1571->stp)
506      {
507      case 0:   if (stp == 1) tracks++; else if (stp == 3) tracks--; break;
508      case 1:   if (stp == 2) tracks++; else if (stp == 0) tracks--; break;
509      case 2: if (stp == 3) tracks++; else if (stp == 1) tracks--; break;
510      case 3: if (stp == 0) tracks++; else if (stp == 2) tracks--; break;
511      }
512
513      if (tracks != 0)
514      {
515         /* step read/write head */
516         floppy_drive_seek(c1571->image, tracks);
517
518         /* read new track data */
519         read_current_track(c1571);
520      }
521
522      c1571->stp = stp;
523   }
524}
525
465526static WRITE_LINE_DEVICE_HANDLER( via1_irq_w )
466527{
467528   c1571_t *c1571 = get_safe_token(device->owner);
r7260r7261
558619    */
559620
560621   c1571_t *c1571 = get_safe_token(device->owner);
561   int stp = data & 0x03;
562   int ds = (data >> 5) & 0x03;
563   int mtr = BIT(data, 2);
564622
565623   /* stepper motor */
566   if (c1571->stp != stp)
567   {
568      int tracks = 0;
624   int stp = data & 0x03;
625   step_motor(c1571, stp);
569626
570      switch (c1571->stp)
571      {
572      case 0:   if (stp == 1) tracks++; else if (stp == 3) tracks--; break;
573      case 1:   if (stp == 2) tracks++; else if (stp == 0) tracks--; break;
574      case 2: if (stp == 3) tracks++; else if (stp == 1) tracks--; break;
575      case 3: if (stp == 0) tracks++; else if (stp == 2) tracks--; break;
576      }
577
578      if (tracks != 0)
579      {
580         c1571->track_len = G64_BUFFER_SIZE;
581         c1571->buffer_pos = G64_DATA_START;
582         c1571->bit_pos = 7;
583         c1571->bit_count = 0;
584
585         /* step read/write head */
586         floppy_drive_seek(c1571->image, tracks);
587
588         /* read track data */
589         floppy_drive_read_track_data_info_buffer(c1571->image, c1571->side, c1571->track_buffer, &c1571->track_len);
590
591         /* extract track length */
592         c1571->track_len = G64_DATA_START + ((c1571->track_buffer[1] << 8) | c1571->track_buffer[0]);
593      }
594
595      c1571->stp = stp;
596   }
597
598627   /* spindle motor */
599   floppy_mon_w(c1571->image, !mtr);
600   timer_enable(c1571->bit_timer, mtr);
628   int mtr = BIT(data, 2);
629   spindle_motor(c1571, mtr);
601630
602631   /* activity LED */
603632
604633   /* density select */
634   int ds = (data >> 5) & 0x03;
635
605636   if (c1571->ds != ds)
606637   {
607638      timer_adjust_periodic(c1571->bit_timer, attotime_zero, 0, ATTOTIME_IN_HZ(C2040_BITRATE[ds]/4));

Previous 509078 RevisionsNext 50


© 1998-2010 The MESS Team