Previous 15994 Revisions Next

r2233 Thursday 3rd April, 2008 at 13:14:01 UTC by Dirk Best
[COUPE] Added support for the SAD disk image format
[src/mess]mess.mak
[src/mess/drivers]coupe.c
[src/mess/formats]coupedsk.c* coupedsk.h*
[src/mess/includes]coupe.h
[src/mess/machine]coupe.c

src/mess/includes/coupe.h
r2232r2233
3333
3434void coupe_update_memory(void);
3535
36DEVICE_IMAGE_LOAD( coupe_floppy );
3736MACHINE_START( coupe );
3837MACHINE_RESET( coupe );
3938
src/mess/machine/coupe.c
r2232r2233
2121struct coupe_asic coupe_regs;
2222
2323
24DEVICE_IMAGE_LOAD( coupe_floppy )
25{
26   UINT64 size = image_length(image);
27
28   switch (size)
29   {
30   case 737280:  /* CP/M Pro-DOS image */
31   case 819200:  /* Standard image */
32      if (device_load_basicdsk_floppy(image) == INIT_PASS)
33      {
34         basicdsk_set_geometry(image, 80, 2, size/81920, 512, 1, 0, FALSE);
35         return INIT_PASS;
36      }
37      break;
38
39   case 819222:   /* SAD format */
40      return INIT_FAIL;
41      break;
42
43   case 983040:   /* SDF - Sam Disk Format (80 tracks) */
44   case 1019904:  /* SDF - Sam Disk Format (83 tracks) */
45      return INIT_FAIL;
46      break;
47   }
48
49   return INIT_FAIL;
50}
51
52
5324static void coupe_update_bank(int bank, UINT8 *memory, int is_readonly)
5425{
5526   read8_machine_func rh;
src/mess/formats/coupedsk.c
r0r2233
1/*************************************************************************
2
3    formats/coupedsk.c
4
5    SAM Coupe disk image formats
6
7**************************************************************************/
8
9#include "coupedsk.h"
10#include "formats/basicdsk.h"
11
12
13#define SAD_HEADER_LEN  22
14
15
16
17/*************************************
18 *
19 *  MGT disk image format
20 *
21 *************************************/
22
23/*
24    Straight rip without any header
25   
26    Data:
27   
28    Side 0 Track 0
29    Side 1 Track 0
30    Side 0 Track 1
31    Side 1 Track 1
32    ...
33*/
34
35
36FLOPPY_CONSTRUCT( coupe_mgt_construct )
37{
38   struct basicdsk_geometry geometry;
39
40   memset(&geometry, 0, sizeof(geometry));
41   geometry.heads = 2;
42   geometry.tracks = 80;
43   geometry.sector_length = 512;
44   geometry.first_sector_id = 1;
45
46   if (params)
47   {
48      /* create */
49      geometry.sectors = option_resolution_lookup_int(params, PARAM_SECTORS);
50   }
51   else
52   {
53      /* load */
54      UINT64 size = floppy_image_size(floppy);
55
56      /* verify size */
57      if (size != 737280 && size != 819200)
58         return FLOPPY_ERROR_INVALIDIMAGE;
59
60      geometry.sectors = size / 81920;
61     
62   }
63
64   return basicdsk_construct(floppy, &geometry);
65}
66
67
68FLOPPY_IDENTIFY( coupe_mgt_identify )
69{
70   UINT64 size;
71
72   size = floppy_image_size(floppy);
73
74   *vote = (size == 737280 || size == 819200) ? 100 : 0;
75   return FLOPPY_ERROR_SUCCESS;   
76}
77
78
79
80/*************************************
81 *
82 *  SAD disk image format
83 *
84 *************************************/
85
86/*
87    Header (22 bytes):
88   
89    0-17 "Aley's disk backup"
90    18   number of sides
91    19   number of tracks
92    20   number of sectors per track
93    21   sector size divided by 64
94   
95    Data:
96   
97    Side 0 Track 0
98    Side 0 Track 1
99    Side 0 Track 2
100    ...
101    Side 1 Track 0
102    Side 1 Track 1
103    ... 
104*/
105
106
107static UINT64 coupe_sad_translate_offset(floppy_image *floppy,
108   const struct basicdsk_geometry *geom, int track, int head, int sector)
109{
110   return head * geom->tracks * geom->sectors + geom->sectors * track + sector;
111}
112
113
114static void coupe_sad_interpret_header(floppy_image *floppy,
115   int *heads, int *tracks, int *sectors, int *sector_size)
116{
117   UINT8 header[SAD_HEADER_LEN];
118
119   floppy_image_read(floppy, header, 0, SAD_HEADER_LEN);
120   
121   *heads = header[18];
122   *tracks = header[19];
123   *sectors = header[20];
124   *sector_size = header[21] << 6;
125}
126
127
128FLOPPY_CONSTRUCT( coupe_sad_construct )
129{
130   struct basicdsk_geometry geometry;
131   int heads, tracks, sectors, sector_length;
132
133   memset(&geometry, 0, sizeof(geometry));
134
135   if (params)
136   {
137      /* create */
138      heads = option_resolution_lookup_int(params, PARAM_HEADS);
139      tracks = option_resolution_lookup_int(params, PARAM_TRACKS);
140      sectors = option_resolution_lookup_int(params, PARAM_SECTORS);
141      sector_length = option_resolution_lookup_int(params, PARAM_SECTOR_LENGTH);
142   }
143   else
144   {
145      /* load */
146      coupe_sad_interpret_header(floppy, &heads, &tracks, &sectors, &sector_length);
147   }
148
149   /* fill in the data */
150   geometry.offset = SAD_HEADER_LEN;
151   geometry.heads = heads;
152   geometry.tracks = tracks;
153   geometry.sectors = sectors;
154   geometry.first_sector_id = 1;
155   geometry.sector_length = sector_length;
156   geometry.translate_offset = coupe_sad_translate_offset;
157
158   return basicdsk_construct(floppy, &geometry);
159}
160
161
162FLOPPY_IDENTIFY( coupe_sad_identify )
163{
164   int heads, tracks, sectors, sector_size;
165   UINT64 size, calculated_size;
166
167   size = floppy_image_size(floppy);
168   
169   /* read values from SAD header */
170   coupe_sad_interpret_header(floppy, &heads, &tracks, &sectors, &sector_size);
171
172   /* calculate expected disk image size */
173   calculated_size = SAD_HEADER_LEN + heads * tracks * sectors * sector_size;
174
175   *vote = (size == calculated_size) ? 100 : 0;
176   return FLOPPY_ERROR_SUCCESS;
177}
178
179
180
181/*************************************
182 *
183 *  SDF disk image format
184 *
185 *************************************/
186
187FLOPPY_CONSTRUCT( coupe_sdf_construct )
188{
189   return FLOPPY_ERROR_INVALIDIMAGE;
190}
191
192
193FLOPPY_IDENTIFY( coupe_sdf_identify )
194{
195   *vote = 0;
196   return FLOPPY_ERROR_SUCCESS;
197}
198
199
200
201/*************************************
202 *
203 *  Floppy options
204 *
205 *************************************/
206
207FLOPPY_OPTIONS_START(coupe)
208   FLOPPY_OPTION
209   (
210      coupe_mgt, "mgt,dsk,sad", "SAM Coupe MGT disk image", coupe_mgt_identify, coupe_mgt_construct,
211      HEADS([2])
212      TRACKS([80])
213      SECTORS(9-[10])
214      SECTOR_LENGTH([512])
215      FIRST_SECTOR_ID([1])
216   )
217   FLOPPY_OPTION
218   (
219      coupe_sad, "sad", "SAM Coupe SAD disk image", coupe_sad_identify, coupe_sad_construct,
220      HEADS(1-[2]-255)
221      TRACKS(1-[80]-255)
222      SECTORS(1-[10]-255)
223      SECTOR_LENGTH(64/128/256/[512]/1024/2048/4096)
224      FIRST_SECTOR_ID([1])
225   )
226   FLOPPY_OPTION
227   (
228      coupe_sdf, "sdf", "SAM Coupe SDF disk image", coupe_sdf_identify, coupe_sdf_construct,
229      HEADS([2])
230      TRACKS([80])
231      SECTORS([10])
232      SECTOR_LENGTH([512])
233      FIRST_SECTOR_ID([1])
234   )
235FLOPPY_OPTIONS_END
src/mess/formats/coupedsk.h
r0r2233
1/*************************************************************************
2
3    formats/coupedsk.h
4
5    SAM Coupe disk image formats
6
7**************************************************************************/
8
9#ifndef COUPEDSK_H_
10#define COUPEDSK_H_
11
12
13#include "formats/flopimg.h"
14
15
16FLOPPY_OPTIONS_EXTERN(coupe);
17
18
19#endif /* COUPEDSK_H_ */
src/mess/mess.mak
r2232r2233
937937   $(MESS_DRIVERS)/electron.o
938938
939939$(MESSOBJ)/samcoupe.a: \
940   $(MESS_FORMATS)/coupedsk.o \
940941   $(MESS_VIDEO)/coupe.o    \
941942   $(MESS_DRIVERS)/coupe.o   \
942943   $(MESS_MACHINE)/coupe.o    \
src/mess/drivers/coupe.c
r2232r2233
6262#include "sound/speaker.h"
6363
6464/* devices */
65#include "devices/basicdsk.h"
65#include "devices/mflopimg.h"
66#include "formats/coupedsk.h"
6667
6768
6869#define COUPE_XTAL_X1  XTAL_24MHz
r2232r2233
583584      case MESS_DEVINFO_INT_COUNT:         info->i = 2; break;
584585
585586      /* --- the following bits of info are returned as pointers to data or functions --- */
586      case MESS_DEVINFO_PTR_LOAD:            info->load = DEVICE_IMAGE_LOAD_NAME(coupe_floppy); break;
587      case MESS_DEVINFO_PTR_FLOPPY_OPTIONS:   info->p = (void *) floppyoptions_coupe; break;
587588
588589      /* --- the following bits of info are returned as NULL-terminated strings --- */
589      case MESS_DEVINFO_STR_FILE_EXTENSIONS:   strcpy(info->s = device_temp_str(), "dsk,sad"); break;
590      case MESS_DEVINFO_STR_NAME+0:         strcpy(info->s = device_temp_str(), "floppydisk0"); break;
591      case MESS_DEVINFO_STR_NAME+1:         strcpy(info->s = device_temp_str(), "floppydisk1"); break;
592      case MESS_DEVINFO_STR_SHORT_NAME+0:      strcpy(info->s = device_temp_str(), "flop0"); break;
593      case MESS_DEVINFO_STR_SHORT_NAME+1:      strcpy(info->s = device_temp_str(), "flop1"); break;
594      case MESS_DEVINFO_STR_DESCRIPTION+0:   strcpy(info->s = device_temp_str(), "Floppy #0"); break;
595      case MESS_DEVINFO_STR_DESCRIPTION+1:   strcpy(info->s = device_temp_str(), "Floppy #1"); break;
590596
591      default:                        legacybasicdsk_device_getinfo(devclass, state, info); break;
597      default:                        floppy_device_getinfo(devclass, state, info); break;
592598   }
593599}
594600

Previous 15994 Revisions Next


© 1998-2018 The MESS Team