r7260 Thursday 4th February, 2010 at 13:56:31 UTC by Curt Coder
[C8050] WIP
[src/mess/formats]d64_dsk.c g64_dsk.h
[src/mess/machine]c2040.c

src/mess/machine/c2040.c
r7259r7260
1111
1212   TODO:
1313
14   - 8050 e27
15   - save state
14   - 8050 illegal track or sector 0,255
15   - 4040 bumps head before reading directory
16   - Micropolis 8x50 stepper motor is same as 4040, except it takes 4 pulses to step a track instead of 1
17   - save states
1618   - remove via_pb_r
1719   - write to disk
18   - alloca buffers
20   - allocate buffers dynamically
1921   - activity/error LEDs
2022
2123*/
r7259r7260
6466struct _c2040_unit_t
6567{
6668   int stp;                        /* stepper motor phase */
69   int mtr;                        /* spindle motor on */
6770
6871   /* track */
6972   UINT8 track_buffer[G64_BUFFER_SIZE];   /* track data buffer */
r7259r7260
211214      int ready = !(c2040->bit_count==9);
212215      int error = !(ready | BIT(c2040->e, 3));
213216
214      logerror("d %u offs %04x/%04x G64 %02x READY %u PA %02x DATA %03x GCR %02x SYNC %u ERROR %u I %04x\n", c2040->drive, c2040->unit[c2040->drive].buffer_pos-1, c2040->unit[c2040->drive].track_len,
217      logerror("d %u offs %04x/%04x G64 %02x READY %u PA %02x DATA %03x GCR %02x SYNC %u ERROR %u I %04x\n", c2040->drive, c2040->unit[c2040->drive].buffer_pos, c2040->unit[c2040->drive].track_len,
215218         c2040->unit[c2040->drive].track_buffer[c2040->unit[c2040->drive].buffer_pos],
216219         ready, pa, c2040->sr & 0x3ff, c2040->e, SYNC, error, c2040->i);
217220   }
r7259r7260
247250      c2040->unit[c2040->drive].bit_pos = 7;
248251      c2040->unit[c2040->drive].buffer_pos++;
249252
250      if (c2040->unit[c2040->drive].buffer_pos == c2040->unit[c2040->drive].track_len + 2)
253      if (c2040->unit[c2040->drive].buffer_pos >= c2040->unit[c2040->drive].track_len)
251254      {
252255         /* loop to the start of the track */
253256         c2040->unit[c2040->drive].buffer_pos = G64_DATA_START;
r7259r7260
271274   {
272275      /* set byte ready flag */
273276      c2040->ready = ready;
274   }
275277
276   if ((device->type == C8050) || (device->type == C8250) || (device->type == SFD1001))
277   {
278      cpu_set_input_line(c2040->cpu_fdc, M6502_SET_OVERFLOW, ready);
278      via_ca1_w(c2040->via, ready);
279      via_cb1_w(c2040->via, ERROR);
280
281      if ((device->type == C8050) || (device->type == C8250) || (device->type == SFD1001))
282      {
283         cpu_set_input_line(c2040->cpu_fdc, M6502_SET_OVERFLOW, ready ? CLEAR_LINE : ASSERT_LINE);
284      }
279285   }
280
281   via_ca1_w(c2040->via, ready);
282   via_cb1_w(c2040->via, ERROR);
283286}
284287
285288/*-------------------------------------------------
r7259r7260
660663   c2040->unit[unit].track_len = G64_DATA_START + ((c2040->unit[unit].track_buffer[1] << 8) | c2040->unit[unit].track_buffer[0]);
661664}
662665
663static void step_motor(c2040_t *c2040, int unit, int stp)
666static void spindle_motor(c2040_t *c2040, int unit, int mtr)
664667{
668   if (c2040->unit[unit].mtr != mtr)
669   {
670      if (mtr)
671      {
672         /* read track data */
673         read_current_track(c2040, unit);
674      }
675
676      floppy_mon_w(c2040->unit[unit].image, !mtr);
677
678      c2040->unit[unit].mtr = mtr;
679   }
680}
681
682static void micropolis_step_motor(c2040_t *c2040, int unit, int stp)
683{
665684   if (c2040->unit[unit].stp != stp)
666685   {
667686      int tracks = 0;
r7259r7260
754773
755774   /* stepper motor 1 */
756775   int s1 = data & 0x03;
757   step_motor(c2040, 1, s1);
776   micropolis_step_motor(c2040, 1, s1);
758777
759778   /* stepper motor 0 */
760779   int s0 = (data >> 2) & 0x03;
761   step_motor(c2040, 0, s0);
780   micropolis_step_motor(c2040, 0, s0);
762781
763782   /* spindle motor 1 */
764783   int mtr1 = BIT(data, 4);
765   floppy_mon_w(c2040->unit[1].image, !mtr1);
784   spindle_motor(c2040, 1, mtr1);
766785
767786   /* spindle motor 0 */
768787   int mtr0 = BIT(data, 5);
769   floppy_mon_w(c2040->unit[0].image, !mtr0);
788   spindle_motor(c2040, 0, mtr0);
770789
771790   timer_enable(c2040->bit_timer, mtr1 | mtr0);
772791}
r7259r7260
830849    via6522_interface c8050_via_intf um3
831850-------------------------------------------------*/
832851
833static void c8050_step_motor(c2040_t *c2040, int unit, int stp)
852static void mpi_step_motor(c2040_t *c2040, int unit, int mtr, int stp)
834853{
835   if (c2040->unit[unit].stp != stp)
854   if (!mtr && (c2040->unit[unit].stp != stp))
836855   {
837856      int tracks = 0;
838857
r7259r7260
903922
904923   c2040_t *c2040 = get_safe_token(device->owner);
905924
925   /* spindle motor 1 */
926   int mtr1 = BIT(data, 4);
927   spindle_motor(c2040, 1, mtr1);
928
929   /* spindle motor 0 */
930   int mtr0 = BIT(data, 5);
931   spindle_motor(c2040, 0, mtr0);
932
906933   /* stepper motor 1 */
907934   int s1 = data & 0x03;
908   c8050_step_motor(c2040, 1, s1);
935   mpi_step_motor(c2040, 0, mtr1, s1);
909936
910937   /* stepper motor 0 */
911938   int s0 = (data >> 2) & 0x03;
912   c8050_step_motor(c2040, 0, s0);
939   mpi_step_motor(c2040, 0, mtr0, s0);
913940
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
922941   timer_enable(c2040->bit_timer, mtr1 | mtr0);
923942
924943   /* TODO pull sync */
r7259r7260
10821101        PB1      DS0
10831102        PB2      DS1
10841103        PB3      WPS
1085        PB4      ODD HD, SIDE SELECT (0=78-154, 1=1-77)
1104        PB4      DRIVE TYPE (0=2A, 1=2C)
10861105        PB5
10871106        PB6      (0=DS, 1=SS)
10881107        PB7      M6504 IRQ
r7259r7260
10961115   /* write protect sense */
10971116   data |= floppy_wpt_r(c2040->unit[c2040->drive].image) << 3;
10981117
1118   /* drive type */
1119   data |= 0x10;
1120
10991121   /* single/dual sided */
11001122   data |= (device->type == C8050) << 6;
11011123
r7259r7260
11121134        PB1      DS0
11131135        PB2      DS1
11141136        PB3      WPS
1115        PB4      ODD HD, SIDE SELECT (0=78-154, 1=1-77)
1137        PB4      ODD HD (0=78-154, 1=1-77)
11161138        PB5
11171139        PB6      (0=DS, 1=SS)
11181140        PB7      M6504 IRQ
r7259r7260
11241146   /* drive select */
11251147   if ((device->type == C8050) || (device->type == C8250))
11261148   {
1127//TODO   c2040->drive = BIT(newdata, 0);
1149      c2040->drive = BIT(newdata, 0);
11281150   }
11291151
11301152   /* density select */
r7259r7260
14301452   ROM_LOAD( "901482-03.ul1", 0x0000, 0x2000, CRC(09a609b9) SHA1(166d8bfaaa9c4767f9b17ad63fc7ae77c199a64e) )
14311453   ROM_LOAD( "901482-04.uh1", 0x2000, 0x2000, CRC(1bcf9df9) SHA1(217f4a8b348658bb365f4a1de21ecbaa6402b1c0) )
14321454   /* 2364-091 ROM DOS 2.5 rev */
1433   ROM_LOAD( "901482-07.ul1", 0x0000, 0x2000, CRC(c7532d90) SHA1(0b6d1e55afea612516df5f07f4a6dccd3bd73963) )
1434   ROM_LOAD( "901482-06.uh1", 0x2000, 0x2000, CRC(3cbd2756) SHA1(7f5fbed0cddb95138dd99b8fe84fddab900e3650) )
1455   ROM_LOAD( "901482-06.ul1", 0x0000, 0x2000, CRC(3cbd2756) SHA1(7f5fbed0cddb95138dd99b8fe84fddab900e3650) )
1456   ROM_LOAD( "901482-07.uh1", 0x2000, 0x2000, CRC(c7532d90) SHA1(0b6d1e55afea612516df5f07f4a6dccd3bd73963) )
14351457   /* 2364 ROM DOS 2.7 */
14361458   ROM_LOAD( "901887-01.ul1", 0x0000, 0x2000, CRC(0073b8b2) SHA1(b10603195f240118fe5fb6c6dfe5c5097463d890) )
14371459   ROM_LOAD( "901888-01.uh1", 0x2000, 0x2000, CRC(de9b6132) SHA1(2e6c2d7ca934e5c550ad14bd5e9e7749686b7af4) )
src/mess/formats/d64_dsk.c
r7259r7260
349349      UINT8 *d64_track_data;
350350      UINT16 gcr_track_size;
351351      UINT8 *gcr_track_data;
352      UINT64 gcr_pos = 2;
352      UINT64 gcr_pos = G64_DATA_START;
353353
354354      /* determine logical track number */
355355      int dos_track = get_dos_track(track);
r7259r7260
719719   for d80 & d82 they are at track 39 bytes 0x18 & 0x19
720720   */
721721   if (dos == DOS25)
722      floppy_image_read(floppy, id, tag->track_offset[0][39] + 0x18, 2);
722      floppy_image_read(floppy, id, tag->track_offset[0][38] + 0x18, 2);
723723   else
724724      floppy_image_read(floppy, id, tag->track_offset[0][34] + 0xa2, 2);
725725   
src/mess/formats/g64_dsk.h
r7259r7260
2222
2323const int C2040_BITRATE[] =
2424{
25   XTAL_16MHz/13,   /* tracks 31-42 */
25   XTAL_16MHz/16,   /* tracks  1-17 */
26   XTAL_16MHz/15,    /* tracks 18-24 */
2627   XTAL_16MHz/14,   /* tracks 25-30 */
27   XTAL_16MHz/15,    /* tracks 18-24 */
28   XTAL_16MHz/16   /* tracks  1-17 */
28   XTAL_16MHz/13   /* tracks 31-42 */
2929};
3030
3131const int C8050_BITRATE[] =
3232{
33   XTAL_12MHz/3/5,   /* tracks 65-84 */
34   XTAL_12MHz/3/6,   /* tracks 54-65 */
35   XTAL_12MHz/3/7, /* tracks 40-53 */
36   XTAL_12MHz/3/8   /* tracks  1-39 */
33   XTAL_12MHz/3/16,   /* tracks  1-39 */
34   XTAL_12MHz/3/15,   /* tracks 40-53 */
35   XTAL_12MHz/3/14,   /* tracks 54-65 */
36   XTAL_12MHz/3/13      /* tracks 65-84 */
3737};
3838
3939/***************************************************************************

Previous 509077 RevisionsNext 50


© 1998-2010 The MESS Team