Previous 15994 Revisions Next

r7170 Monday 25th January, 2010 at 09:08:00 UTC by Curt Coder
[PET] C2040 floppy series WIP
[src/mess/formats]d64_dsk.c
[src/mess/machine]c2040.c

src/mess/machine/c2040.c
r7169r7170
77
88**********************************************************************/
99
10/*
11
12   TODO:
13
14   - find GCR rom region
15   - decode GCR
16   - write
17
18*/
19
1020#include "emu.h"
1121#include "c2040.h"
1222#include "cpu/m6502/m6502.h"
r7169r7170
3141#define M6522_TAG      "um3"
3242#define M6530_TAG      "uk3"
3343
44static const double C2040_BITRATE[4] =
45{
46   XTAL_16MHz/13.0,   /* tracks 1-17 */
47   XTAL_16MHz/14.0,   /* tracks 18-24 */
48   XTAL_16MHz/15.0,    /* tracks 25-30 */
49   XTAL_16MHz/16.0      /* tracks 31-42 */
50};
51
52#define SYNC_MARK         0x3ff      /* 10 consecutive 1-bits */
53
54#define TRACK_BUFFER_SIZE   8194      /* 2 bytes track length + maximum of 8192 bytes of GCR encoded data */
55#define TRACK_DATA_START   2
56
3457/***************************************************************************
3558    TYPE DEFINITIONS
3659***************************************************************************/
3760
61typedef struct _c2040_unit_t c2040_unit_t;
62struct _c2040_unit_t
63{
64   int stp;                        /* stepper motor */
65   UINT8 track_buffer[TRACK_BUFFER_SIZE];   /* track data buffer */
66   int track_len;                     /* track length */
67   int buffer_pos;                     /* current byte position within track buffer */
68   int bit_pos;                     /* current bit position within track buffer byte */
69
70   /* devices */
71   const device_config *image;
72};
73
3874typedef struct _c2040_t c2040_t;
3975struct _c2040_t
4076{
r7169r7170
4278   int address;                  /* serial bus address - 8 */
4379   int drive;                     /* selected drive */
4480   int side;                     /* selected side */
81   c2040_unit_t unit[2];            /* drive unit */
4582
83   /* track */
84   int bit_count;                  /* current data byte bit counter */
85   UINT16 data;                  /* data shift register */
86   int ds;                        /* density select */
87   UINT8* gcr;                     /* GCR encoder/decoder ROM */
88   UINT8 pi;                     /* parallel data input */
89
4690   /* IEEE-488 bus */
4791   int nrfd_out;                  /* not ready for data */
4892   int ndac_out;                  /* not data accepted */
4993   int atna;                     /* attention acknowledge */
5094
5195   /* signals */
96   int error;
97   int ready;                     /* byte ready */
5298   int mode;                     /* mode select */
5399   int rw;                        /* read/write select */
54100
r7169r7170
60106   const device_config *riot2;
61107   const device_config *via;
62108   const device_config *bus;
63   const device_config *image[2];
109
110   /* timers */
111   emu_timer *bit_timer;
64112};
65113
66114/***************************************************************************
r7169r7170
89137***************************************************************************/
90138
91139/*-------------------------------------------------
140    TIMER_CALLBACK( bit_tick )
141-------------------------------------------------*/
142
143static TIMER_CALLBACK( bit_tick )
144{
145   const device_config *device = (device_config *)ptr;
146   c2040_t *c2040 = get_safe_token(device);
147   int ready = 1;
148
149   /* shift in data from the read head */
150   c2040->data <<= 1;
151   c2040->data |= BIT(c2040->unit[c2040->drive].track_buffer[c2040->unit[c2040->drive].buffer_pos], c2040->unit[c2040->drive].bit_pos);
152   c2040->unit[c2040->drive].bit_pos--;
153   c2040->bit_count++;
154
155   if (c2040->unit[c2040->drive].bit_pos < 0)
156   {
157      c2040->unit[c2040->drive].bit_pos = 7;
158      c2040->unit[c2040->drive].buffer_pos++;
159
160      if (c2040->unit[c2040->drive].buffer_pos > c2040->unit[c2040->drive].track_len + 1)
161      {
162         /* loop to the start of the track */
163         c2040->unit[c2040->drive].buffer_pos = TRACK_DATA_START;
164      }
165   }
166
167   if ((c2040->data & SYNC_MARK) == SYNC_MARK)
168   {
169      /* SYNC detected */
170      c2040->bit_count = 0;
171   }
172
173   if (c2040->bit_count > 7)
174   {
175      /* byte ready */
176      c2040->bit_count = 0;
177      ready = 0;
178
179      if (!(c2040->data & 0xff))
180      {
181         /* simulate weak bits with randomness */
182         c2040->data = (c2040->data & 0xff00) | (mame_rand(machine) & 0xff);
183      }
184   }
185
186   if (c2040->ready != ready)
187   {
188      via_ca1_w(c2040->via, ready);
189
190      c2040->ready = ready;
191   }
192}
193
194/*-------------------------------------------------
92195    c2040_ieee488_atn_w - IEEE-488 bus attention
93196-------------------------------------------------*/
94197
r7169r7170
148251ADDRESS_MAP_END
149252
150253/*-------------------------------------------------
151    ADDRESS_MAP( c3040_dos_map )
152-------------------------------------------------*/
153
154static ADDRESS_MAP_START( c3040_dos_map, ADDRESS_SPACE_PROGRAM, 8 )
155   AM_IMPORT_FROM(c2040_dos_map)
156   AM_RANGE(0x5000, 0x7fff) AM_ROM AM_REGION("c3040", 0x0000)
157ADDRESS_MAP_END
158
159/*-------------------------------------------------
160    ADDRESS_MAP( c3040_fdc_map )
161-------------------------------------------------*/
162
163static ADDRESS_MAP_START( c3040_fdc_map, ADDRESS_SPACE_PROGRAM, 8 )
164   AM_IMPORT_FROM(c2040_fdc_map)
165   AM_RANGE(0x1c00, 0x1fff) AM_ROM AM_REGION("c3040", 0x3000)
166ADDRESS_MAP_END
167
168/*-------------------------------------------------
169254    ADDRESS_MAP( c4040_dos_map )
170255-------------------------------------------------*/
171256
172257static ADDRESS_MAP_START( c4040_dos_map, ADDRESS_SPACE_PROGRAM, 8 )
173   AM_IMPORT_FROM(c2040_dos_map)
258   ADDRESS_MAP_GLOBAL_MASK(0x7fff)
259   AM_RANGE(0x0000, 0x007f) AM_MIRROR(0x0f00) AM_RAM // 6532 #1
260   AM_RANGE(0x0080, 0x00ff) AM_MIRROR(0x0f00) AM_RAM // 6532 #2
261   AM_RANGE(0x0200, 0x020f) AM_MIRROR(0x0d70) AM_DEVREADWRITE(M6532_0_TAG, riot6532_r, riot6532_w)
262   AM_RANGE(0x0280, 0x028f) AM_MIRROR(0x0d70) AM_DEVREADWRITE(M6532_1_TAG, riot6532_r, riot6532_w)
263   AM_RANGE(0x1000, 0x13ff) AM_MIRROR(0x0c00) AM_RAM AM_SHARE("share1")
264   AM_RANGE(0x2000, 0x23ff) AM_MIRROR(0x0c00) AM_RAM AM_SHARE("share2")
265   AM_RANGE(0x3000, 0x33ff) AM_MIRROR(0x0c00) AM_RAM AM_SHARE("share3")
266   AM_RANGE(0x4000, 0x43ff) AM_MIRROR(0x0c00) AM_RAM AM_SHARE("share4")
174267   AM_RANGE(0x5000, 0x7fff) AM_ROM AM_REGION("c4040", 0x0000)
175268ADDRESS_MAP_END
176269
r7169r7170
179272-------------------------------------------------*/
180273
181274static ADDRESS_MAP_START( c4040_fdc_map, ADDRESS_SPACE_PROGRAM, 8 )
182   AM_IMPORT_FROM(c2040_fdc_map)
275   ADDRESS_MAP_GLOBAL_MASK(0x1fff)
276   AM_RANGE(0x0000, 0x003f) AM_MIRROR(0x0300) AM_RAM // 6530
277   AM_RANGE(0x0040, 0x004f) AM_MIRROR(0x0330) AM_DEVREADWRITE(M6522_TAG, via_r, via_w)
278   AM_RANGE(0x0080, 0x008f) AM_MIRROR(0x0330) AM_DEVREADWRITE(M6530_TAG, riot6532_r, riot6532_w)
279   AM_RANGE(0x0400, 0x07ff) AM_RAM AM_SHARE("share1")
280   AM_RANGE(0x0800, 0x0bff) AM_RAM AM_SHARE("share2")
281   AM_RANGE(0x0c00, 0x0fff) AM_RAM AM_SHARE("share3")
282   AM_RANGE(0x1000, 0x13ff) AM_RAM AM_SHARE("share4")
183283   AM_RANGE(0x1c00, 0x1fff) AM_ROM AM_REGION("c4040", 0x3000)
184284ADDRESS_MAP_END
185285
r7169r7170
220320-------------------------------------------------*/
221321
222322static ADDRESS_MAP_START( sfd1001_dos_map, ADDRESS_SPACE_PROGRAM, 8 )
223   AM_IMPORT_FROM(c8050_dos_map)
323   AM_RANGE(0x0000, 0x007f) AM_MIRROR(0x0f00) AM_RAM // 6532 #1
324   AM_RANGE(0x0080, 0x00ff) AM_MIRROR(0x0f00) AM_RAM // 6532 #2
325   AM_RANGE(0x0200, 0x020f) AM_MIRROR(0x0d70) AM_DEVREADWRITE(M6532_0_TAG, riot6532_r, riot6532_w)
326   AM_RANGE(0x0280, 0x028f) AM_MIRROR(0x0d70) AM_DEVREADWRITE(M6532_1_TAG, riot6532_r, riot6532_w)
327   AM_RANGE(0x1000, 0x13ff) AM_MIRROR(0x0c00) AM_RAM AM_SHARE("share1")
328   AM_RANGE(0x2000, 0x23ff) AM_MIRROR(0x0c00) AM_RAM AM_SHARE("share2")
329   AM_RANGE(0x3000, 0x33ff) AM_MIRROR(0x0c00) AM_RAM AM_SHARE("share3")
330   AM_RANGE(0x4000, 0x43ff) AM_MIRROR(0x0c00) AM_RAM AM_SHARE("share4")
224331   AM_RANGE(0xc000, 0xffff) AM_ROM AM_REGION("sfd1001", 0x0000)
225332ADDRESS_MAP_END
226333
r7169r7170
229336-------------------------------------------------*/
230337
231338static ADDRESS_MAP_START( sfd1001_fdc_map, ADDRESS_SPACE_PROGRAM, 8 )
232   AM_IMPORT_FROM(c8050_fdc_map)
339   ADDRESS_MAP_GLOBAL_MASK(0x1fff)
340   AM_RANGE(0x0000, 0x003f) AM_MIRROR(0x0300) AM_RAM // 6530
341   AM_RANGE(0x0040, 0x004f) AM_MIRROR(0x0330) AM_DEVREADWRITE(M6522_TAG, via_r, via_w)
342   AM_RANGE(0x0080, 0x008f) AM_MIRROR(0x0330) AM_DEVREADWRITE(M6530_TAG, riot6532_r, riot6532_w)
343   AM_RANGE(0x0400, 0x07ff) AM_RAM AM_SHARE("share1")
344   AM_RANGE(0x0800, 0x0bff) AM_RAM AM_SHARE("share2")
345   AM_RANGE(0x0c00, 0x0fff) AM_RAM AM_SHARE("share3")
346   AM_RANGE(0x1000, 0x13ff) AM_RAM AM_SHARE("share4")
233347   AM_RANGE(0x1800, 0x1fff) AM_ROM AM_REGION("sfd1001", 0x4000)
234348ADDRESS_MAP_END
235349
r7169r7170
463577
464578    */
465579
466   return 0;
580   c2040_t *c2040 = get_safe_token(device->owner);
581
582//   UINT16 gcr_addr = (c2040->rw << 10) | (c2040->data & 0x3ff);
583   UINT8 e = 0;//memory_region(device->machine, "c4040:c4040")[0x3400 + gcr_addr];
584   UINT16 i = c2040->data;
585
586   return (BIT(e, 6) << 7) | (BIT(i, 7) << 6) | (e & 0x30) | (BIT(e, 2) << 3) | (i & 0x04) | (e & 0x03);
467587}
468588
469589static READ8_DEVICE_HANDLER( c2040_via_pb_r )
r7169r7170
472592
473593        bit     description
474594
475        PB0      SIA
476        PB1      SIB
477        PB2      SOA
478        PB3      SOB
595        PB0      S1A
596        PB1      S1B
597        PB2      S0A
598        PB3      S0B
479599        PB4      MTR1
480600        PB5      MTR0
481601        PB6     
r7169r7170
486606   return 0;
487607}
488608
609static void step_motor(c2040_t *c2040, int unit, int stp)
610{
611   if (c2040->unit[unit].stp != stp)
612   {
613      int tracks = 0;
614
615      switch (c2040->unit[unit].stp)
616      {
617      case 0:   if (stp == 1) tracks++; else if (stp == 3) tracks--; break;
618      case 1:   if (stp == 2) tracks++; else if (stp == 0) tracks--; break;
619      case 2: if (stp == 3) tracks++; else if (stp == 1) tracks--; break;
620      case 3: if (stp == 0) tracks++; else if (stp == 2) tracks--; break;
621      }
622
623      if (tracks != 0)
624      {
625         c2040->unit[unit].track_len = TRACK_BUFFER_SIZE;
626         c2040->unit[unit].buffer_pos = TRACK_DATA_START;
627         c2040->unit[unit].bit_pos = 7;
628         c2040->bit_count = 0;
629
630         /* step read/write head */
631         floppy_drive_seek(c2040->unit[unit].image, tracks);
632
633         /* read track data */
634         floppy_drive_read_track_data_info_buffer(c2040->unit[unit].image, c2040->side, c2040->unit[unit].track_buffer, &c2040->unit[unit].track_len);
635
636         /* extract track length */
637         c2040->unit[unit].track_len = (c2040->unit[unit].track_buffer[1] << 8) | c2040->unit[unit].track_buffer[0];
638      }
639   }
640}
641
489642static WRITE8_DEVICE_HANDLER( c2040_via_pb_w )
490643{
491644   /*
492645
493646        bit     description
494647
495        PB0      SIA
496        PB1      SIB
497        PB2      SOA
498        PB3      SOB
648        PB0      S1A
649        PB1      S1B
650        PB2      S0A
651        PB3      S0B
499652        PB4      MTR1
500653        PB5      MTR0
501654        PB6     
502655        PB7     
503656
504657    */
658
659   c2040_t *c2040 = get_safe_token(device->owner);
660
661   /* stepper motor 1 */
662   int s1 = data & 0x03;
663   step_motor(c2040, 1, s1);
664
665   /* stepper motor 0 */
666   int s0 = (data >> 2) & 0x03;
667   step_motor(c2040, 0, s0);
668
669   /* spindle motor 1 */
670   int mtr1 = BIT(data, 4);
671   floppy_mon_w(c2040->unit[1].image, !mtr1);
672
673   /* spindle motor 0 */
674   int mtr0 = BIT(data, 5);
675   floppy_mon_w(c2040->unit[0].image, !mtr0);
676
677   timer_enable(c2040->bit_timer, mtr1 | mtr0);
505678}
506679
507680static READ8_DEVICE_HANDLER( c8050_via_pb_r )
r7169r7170
510683
511684        bit     description
512685
513        PB0      SIA
514        PB1      SIB
515        PB2      SOA
516        PB3      SOB
686        PB0      S1A
687        PB1      S1B
688        PB2      S0A
689        PB3      S0B
517690        PB4      MTR1
518691        PB5      MTR0
519692        PB6      PULL SYNC
r7169r7170
521694
522695    */
523696
524   return 0;
697   c2040_t *c2040 = get_safe_token(device->owner);
698
699   UINT8 data = 0;
700
701   /* SYNC detected */
702   data |= !((c2040->data & SYNC_MARK) == SYNC_MARK) << 7;
703
704   return data;
525705}
526706
527707static WRITE8_DEVICE_HANDLER( c8050_via_pb_w )
r7169r7170
530710
531711        bit     description
532712
533        PB0      SIA
534        PB1      SIB
535        PB2      SOA
536        PB3      SOB
713        PB0      S1A
714        PB1      S1B
715        PB2      S0A
716        PB3      S0B
537717        PB4      MTR1
538718        PB5      MTR0
539719        PB6      PULL SYNC
540720        PB7      SYNC
541721
542722    */
723
724   c2040_via_pb_w(device, 0, data);
543725}
544726
545727static READ_LINE_DEVICE_HANDLER( ready_r )
546728{
547   return 0;
729   c2040_t *c2040 = get_safe_token(device->owner);
730
731   return c2040->ready;
548732}
549733
550734static READ_LINE_DEVICE_HANDLER( err_r )
551735{
552   return 0;
736   c2040_t *c2040 = get_safe_token(device->owner);
737
738   //UINT16 gcr_addr = (c2040->rw << 10) | (c2040->data & 0x3ff);
739   UINT8 e = 0;//memory_region(device->machine, "c4040:c4040")[0x3400 + gcr_addr];
740
741   return (!c2040->ready & !BIT(e, 3));
553742}
554743
555744static WRITE_LINE_DEVICE_HANDLER( mode_sel_w )
r7169r7170
610799    riot6532_interface c2040_riot2_intf uk3
611800-------------------------------------------------*/
612801
613static READ8_DEVICE_HANDLER( c2040_riot2_pa_r )
802static READ8_DEVICE_HANDLER( pi_r )
614803{
615804   /*
616805
r7169r7170
627816
628817    */
629818
630   return 0;
819   c2040_t *c2040 = get_safe_token(device->owner);
820
821   return c2040->pi;
631822}
632823
633static WRITE8_DEVICE_HANDLER( c2040_riot2_pa_w )
824static WRITE8_DEVICE_HANDLER( pi_w )
634825{
635826   /*
636827
r7169r7170
646837        PA7      PI7
647838
648839    */
840
841   c2040_t *c2040 = get_safe_token(device->owner);
842
843   c2040->pi = data;
649844}
650845
651846static READ8_DEVICE_HANDLER( c2040_riot2_pb_r )
r7169r7170
670865   UINT8 data = 0;
671866
672867   /* write protect sense */
673   data |= floppy_wpt_r(c2040->image[c2040->drive]) << 3;
868   data |= floppy_wpt_r(c2040->unit[c2040->drive].image) << 3;
674869
675   /* TODO sync */
870   /* SYNC detected */
871   data |= !((c2040->data & SYNC_MARK) == SYNC_MARK) << 6;
676872
677873   return data;
678874}
r7169r7170
699895   /* drive select */
700896   c2040->drive = BIT(data, 0);
701897
702   /* TODO density select */
898   /* density select */
899   int ds = (data >> 1) & 0x03;
703900
704   /* side select */
705   c2040->side = !BIT(data, 4);
901   if (c2040->ds != ds)
902   {
903      timer_adjust_periodic(c2040->bit_timer, attotime_zero, 0, ATTOTIME_IN_HZ(C2040_BITRATE[ds]/4));
904      c2040->ds = ds;
905   }
706906}
707907
708908static READ8_DEVICE_HANDLER( c8050_riot2_pb_r )
r7169r7170
727927   UINT8 data = 0;
728928
729929   /* write protect sense */
730   data |= floppy_wpt_r(c2040->image[c2040->drive]) << 3;
930   data |= floppy_wpt_r(c2040->unit[c2040->drive].image) << 3;
731931
732932   /* single/dual sided */
733933   data |= (device->type == C8050) << 6;
r7169r7170
754954
755955   c2040_t *c2040 = get_safe_token(device->owner);
756956
757   /* drive select */
758   c2040->drive = BIT(data, 0);
957   c2040_riot2_pb_w(device, 0, data);
759958
760   /* TODO density select */
761
762959   /* side select */
763960   c2040->side = !BIT(data, 4);
764961}
r7169r7170
772969
773970static const riot6532_interface c2040_riot2_intf =
774971{
775   DEVCB_HANDLER(c2040_riot2_pa_r),
972   DEVCB_HANDLER(pi_r),
776973   DEVCB_HANDLER(c2040_riot2_pb_r),
777   DEVCB_HANDLER(c2040_riot2_pa_w),
974   DEVCB_HANDLER(pi_w),
778975   DEVCB_HANDLER(c2040_riot2_pb_w),
779976   DEVCB_LINE(c2040_riot2_irq_w)
780977};
781978
782979static const riot6532_interface c8050_riot2_intf =
783980{
784   DEVCB_HANDLER(c2040_riot2_pa_r),
981   DEVCB_HANDLER(pi_r),
785982   DEVCB_HANDLER(c8050_riot2_pb_r),
786   DEVCB_HANDLER(c2040_riot2_pa_w),
983   DEVCB_HANDLER(pi_w),
787984   DEVCB_HANDLER(c8050_riot2_pb_w),
788985   DEVCB_LINE(c2040_riot2_irq_w)
789986};
r7169r7170
793990-------------------------------------------------*/
794991
795992static FLOPPY_OPTIONS_START( c2040 )
796   FLOPPY_OPTION( c2040, "d67", "Commodore 2040 (DOS 1) Disk Image", d67_dsk_identify, d64_dsk_construct, NULL )
993   FLOPPY_OPTION( c2040, "d67", "Commodore 2040/3040 (DOS 1) Disk Image", d67_dsk_identify, d64_dsk_construct, NULL )
797994FLOPPY_OPTIONS_END
798995
799996/*-------------------------------------------------
800    FLOPPY_OPTIONS( c3040 )
997    FLOPPY_OPTIONS( c4040 )
801998-------------------------------------------------*/
802999
803static FLOPPY_OPTIONS_START( c3040 )
804   FLOPPY_OPTION( c3040, "d64", "Commodore 1541 Disk Image", d64_dsk_identify, d64_dsk_construct, NULL )
805   FLOPPY_OPTION( c3040, "g64", "Commodore 1541 GCR Disk Image", g64_dsk_identify, g64_dsk_construct, NULL )
1000static FLOPPY_OPTIONS_START( c4040 )
1001   FLOPPY_OPTION( c4040, "d64", "Commodore 4040 Disk Image", d64_dsk_identify, d64_dsk_construct, NULL )
1002   FLOPPY_OPTION( c4040, "g64", "Commodore 4040 GCR Disk Image", g64_dsk_identify, g64_dsk_construct, NULL )
8061003FLOPPY_OPTIONS_END
8071004
8081005/*-------------------------------------------------
r7169r7170
8391036};
8401037
8411038/*-------------------------------------------------
842    floppy_config c3040_floppy_config
1039    floppy_config c4040_floppy_config
8431040-------------------------------------------------*/
8441041
845static const floppy_config c3040_floppy_config =
1042static const floppy_config c4040_floppy_config =
8461043{
8471044   DEVCB_NULL,
8481045   DEVCB_NULL,
r7169r7170
8501047   DEVCB_NULL,
8511048   DEVCB_NULL,
8521049   FLOPPY_DRIVE_SS_80,
853   FLOPPY_OPTIONS_NAME(c3040),
1050   FLOPPY_OPTIONS_NAME(c4040),
8541051   DO_NOT_KEEP_GEOMETRY
8551052};
8561053
r7169r7170
9071104MACHINE_DRIVER_END
9081105
9091106/*-------------------------------------------------
910    MACHINE_DRIVER( c3040 )
911-------------------------------------------------*/
912
913static MACHINE_DRIVER_START( c3040 )
914   /* DOS */
915   MDRV_CPU_ADD(M6502_DOS_TAG, M6502, XTAL_16MHz/16)
916   MDRV_CPU_PROGRAM_MAP(c3040_dos_map)
917   MDRV_RIOT6532_ADD(M6532_0_TAG, XTAL_16MHz/16, c2040_riot0_intf)
918   MDRV_RIOT6532_ADD(M6532_1_TAG, XTAL_16MHz/16, c2040_riot1_intf)
919
920   /* controller */
921   MDRV_CPU_ADD(M6502_FDC_TAG, M6502, XTAL_16MHz/16)
922   MDRV_CPU_PROGRAM_MAP(c3040_fdc_map)
923   MDRV_VIA6522_ADD(M6522_TAG, XTAL_16MHz/16, c2040_via_intf)
924   MDRV_RIOT6532_ADD(M6530_TAG, XTAL_16MHz/16, c2040_riot2_intf)
925
926   MDRV_FLOPPY_2_DRIVES_ADD(c3040_floppy_config)
927MACHINE_DRIVER_END
928
929/*-------------------------------------------------
9301107    MACHINE_DRIVER( c4040 )
9311108-------------------------------------------------*/
9321109
r7169r7170
9431120   MDRV_VIA6522_ADD(M6522_TAG, XTAL_16MHz/16, c2040_via_intf)
9441121   MDRV_RIOT6532_ADD(M6530_TAG, XTAL_16MHz/16, c2040_riot2_intf)
9451122
946   MDRV_FLOPPY_2_DRIVES_ADD(c3040_floppy_config)
1123   MDRV_FLOPPY_2_DRIVES_ADD(c4040_floppy_config)
9471124MACHINE_DRIVER_END
9481125
9491126/*-------------------------------------------------
r7169r7170
10121189
10131190ROM_START( c2040 )
10141191   ROM_REGION( 0x2c00, "c2040", ROMREGION_LOADBYNAME )
1015   /* DOS 1 */
1192   /* DOS 1.0 */
10161193   ROM_LOAD( "901468-06.ul1", 0x0000, 0x1000, CRC(25b5eed5) SHA1(4d9658f2e6ff3276e5c6e224611a66ce44b16fc7) )
10171194   ROM_LOAD( "901468-07.uh1", 0x1000, 0x1000, CRC(9b09ae83) SHA1(6a51c7954938439ca8342fc295bda050c06e1791) )
10181195
r7169r7170
10241201ROM_END
10251202
10261203/*-------------------------------------------------
1027    ROM( c3040 )
1204    ROM( c4040 )
10281205-------------------------------------------------*/
10291206
1030ROM_START( c3040 )
1031   ROM_REGION( 0x3c00, "c3040", ROMREGION_LOADBYNAME )
1032   /* DOS 2 */
1207ROM_START( c4040 )
1208   ROM_REGION( 0x3c00, "c4040", ROMREGION_LOADBYNAME )
1209   /* DOS 2.1 */
10331210   ROM_LOAD( "901468-11.uj1", 0x0000, 0x1000, CRC(b7157458) SHA1(8415f3159dea73161e0cef7960afa6c76953b6f8) )
10341211   ROM_LOAD( "901468-12.ul1", 0x1000, 0x1000, CRC(02c44ff9) SHA1(e8a94f239082d45f64f01b2d8e488d18fe659cbb) )
10351212   ROM_LOAD( "901468-13.uh1", 0x2000, 0x1000, CRC(cbd785b3) SHA1(6ada7904ac9d13c3f1c0a8715f9c4be1aa6eb0bb) )
1036
1037   /* RIOT DOS 2 */
1038   ROM_LOAD( "901466-04.uk3", 0x3000, 0x0400, CRC(0ab338dc) SHA1(6645fa40b81be1ff7d1384e9b52df06a26ab0bfb) )
1039
1040   /* ROM GCR */
1041   ROM_LOAD( "901467.uk6", 0x3400, 0x800, CRC(a23337eb) SHA1(97df576397608455616331f8e837cb3404363fa2) )
1042ROM_END
1043
1044/*-------------------------------------------------
1045    ROM( c4040 )
1046-------------------------------------------------*/
1047
1048ROM_START( c4040 )
1049   ROM_REGION( 0x3c00, "c4040", ROMREGION_LOADBYNAME )
10501213   /* DOS 2 rev */
10511214   ROM_LOAD( "901468-14.uj1", 0x0000, 0x1000, CRC(bc4d4872) SHA1(ffb992b82ec913ddff7be964d7527aca3e21580c) )
10521215   ROM_LOAD( "901468-15.ul1", 0x1000, 0x1000, CRC(b6970533) SHA1(f702d6917fe8a798740ba4d467b500944ae7b70a) )
r7169r7170
11401303   c2040->riot2 = device_find_child_by_tag(device, M6530_TAG);
11411304   c2040->via = device_find_child_by_tag(device, M6522_TAG);
11421305   c2040->bus = devtag_get_device(device->machine, config->bus_tag);
1143   c2040->image[0] = device_find_child_by_tag(device, FLOPPY_0);
1144   c2040->image[1] = device_find_child_by_tag(device, FLOPPY_1);
1306   c2040->unit[0].image = device_find_child_by_tag(device, FLOPPY_0);
1307   c2040->unit[1].image = device_find_child_by_tag(device, FLOPPY_1);
11451308
1309   /* find GCR ROM */
1310
1311   /* allocate data timer */
1312   c2040->bit_timer = timer_alloc(device->machine, bit_tick, (void *)device);
1313
11461314   /* register for state saving */
1147   state_save_register_device_item(device, 0, c2040->address);
1315//   state_save_register_device_item(device, 0, c2040->);
11481316}
11491317
11501318/*-------------------------------------------------
r7169r7170
11551323{
11561324   c2040_t *c2040 = get_safe_token(device);
11571325
1326   /* reset devices */
11581327   device_reset(c2040->cpu_dos);
11591328   device_reset(c2040->cpu_fdc);
11601329   device_reset(c2040->riot0);
11611330   device_reset(c2040->riot1);
11621331   device_reset(c2040->riot2);
11631332   device_reset(c2040->via);
1333
1334   /* toggle SO */
1335   cpu_set_input_line(c2040->cpu_dos, M6502_SET_OVERFLOW, ASSERT_LINE);
1336   cpu_set_input_line(c2040->cpu_dos, M6502_SET_OVERFLOW, CLEAR_LINE);
11641337}
11651338
11661339/*-------------------------------------------------
r7169r7170
12031376   switch (state)
12041377   {
12051378      /* --- the following bits of info are returned as pointers --- */
1206      case DEVINFO_PTR_ROM_REGION:               info->romregion = ROM_NAME(c3040);                     break;
1207      case DEVINFO_PTR_MACHINE_CONFIG:            info->machine_config = MACHINE_DRIVER_NAME(c3040);         break;
1379      case DEVINFO_PTR_ROM_REGION:               info->romregion = ROM_NAME(c2040);                     break;
1380      case DEVINFO_PTR_MACHINE_CONFIG:            info->machine_config = MACHINE_DRIVER_NAME(c2040);         break;
12081381
12091382      /* --- the following bits of info are returned as NULL-terminated strings --- */
12101383      case DEVINFO_STR_NAME:                     strcpy(info->s, "Commodore 3040");                     break;
src/mess/formats/d64_dsk.c
r7169r7170
11/*
22
3   Commodore sector format
4
5   SYNC                  FF * 5
6   08
7   ID1
8   ID2
9   TRACK                  1..35 (2040), 1..77 (8050)
10   SECTOR                  0..20 (2040), 0..28 (8050)
11   CHECKSUM
12   GAP 1                  55 * 9 (2040), 8 (1541)
13
14   SYNC                  FF * 5
15   07
16   BYTE 0
17   BYTE 1
18   254 BYTES OF DATA
19   CHECKSUM
20   GAP 2                  55 * 8..19
21
22*/
23
24/*
25
326 Commodore GCR format
427
528Original    Encoded

Previous 15994 Revisions Next


© 1998-2018 The MESS Team