Previous 15994 Revisions Next

r6547 Saturday 5th December, 2009 at 21:28:26 UTC by Tim Schuerewegen
Added support for the native GamePark SmartMedia file format to the SmartMedia device.
[src/mess/machine]smartmed.c

src/mess/machine/smartmed.c
r6546r6547
5656   UINT32BE log2_pages_per_block;
5757} disk_image_header;
5858
59typedef struct disk_image_format_2_header
60{
61   UINT8 data1[3];
62   UINT8 padding1[256-3];
63   UINT8 data2[16];
64   UINT8 data3[16];
65   UINT8 padding2[768-32];
66} disk_image_format_2_header;
67
5968enum
6069{
6170   header_len = sizeof(disk_image_header)
r6546r6547
144153/*
145154    Load a SmartMedia image
146155*/
147static DEVICE_IMAGE_LOAD( smartmedia )
156static DEVICE_IMAGE_LOAD( smartmedia_format_1 )
148157{
149158   smartmedia_t *sm = get_safe_token(image);
150159   disk_image_header custom_header;
r6546r6547
195204   return INIT_PASS;
196205}
197206
207static int detect_geometry( smartmedia_t *sm, UINT8 id1, UINT8 id2)
208{
209   int result = 0;
210
211   switch (id1)
212   {
213      case 0xEC :
214      {
215         switch (id2)
216         {
217            case 0xA4 : sm->page_data_size = 0x0100; sm->num_pages = 0x00800; sm->page_total_size = 0x0108; sm->log2_pages_per_block = 0; result = 1; break;
218            case 0x6E : sm->page_data_size = 0x0100; sm->num_pages = 0x01000; sm->page_total_size = 0x0108; sm->log2_pages_per_block = 0; result = 1; break;
219            case 0xEA : sm->page_data_size = 0x0100; sm->num_pages = 0x02000; sm->page_total_size = 0x0108; sm->log2_pages_per_block = 0; result = 1; break;
220            case 0xE3 : sm->page_data_size = 0x0200; sm->num_pages = 0x02000; sm->page_total_size = 0x0210; sm->log2_pages_per_block = 0; result = 1; break;
221            case 0xE6 : sm->page_data_size = 0x0200; sm->num_pages = 0x04000; sm->page_total_size = 0x0210; sm->log2_pages_per_block = 0; result = 1; break;
222            case 0x73 : sm->page_data_size = 0x0200; sm->num_pages = 0x08000; sm->page_total_size = 0x0210; sm->log2_pages_per_block = 0; result = 1; break;
223            case 0x75 : sm->page_data_size = 0x0200; sm->num_pages = 0x10000; sm->page_total_size = 0x0210; sm->log2_pages_per_block = 0; result = 1; break;
224            case 0x76 : sm->page_data_size = 0x0200; sm->num_pages = 0x20000; sm->page_total_size = 0x0210; sm->log2_pages_per_block = 0; result = 1; break;
225            case 0x79 : sm->page_data_size = 0x0200; sm->num_pages = 0x40000; sm->page_total_size = 0x0210; sm->log2_pages_per_block = 0; result = 1; break;
226         }
227      }
228      break;
229   }
230
231   return result;
232}
233
234static DEVICE_IMAGE_LOAD( smartmedia_format_2 )
235{
236   smartmedia_t *sm = get_safe_token(image);
237   disk_image_format_2_header custom_header;
238   int bytes_read, i, j;
239
240   bytes_read = image_fread(image, &custom_header, sizeof(custom_header));
241   if (bytes_read != sizeof(custom_header))
242   {
243      return INIT_FAIL;
244   }
245
246   if (custom_header.data1[0] != 0xEC)
247   {
248      return INIT_FAIL;
249   }
250
251   if (!detect_geometry( sm, custom_header.data1[0], custom_header.data1[1]))
252   {
253      return INIT_FAIL;
254   }
255
256   sm->data_ptr = auto_alloc_array(image->machine, UINT8, sm->page_total_size*sm->num_pages);
257   sm->data_uid_ptr = auto_alloc_array(image->machine, UINT8, 256 + 16);
258   sm->mode = SM_M_INIT;
259   sm->pointer_mode = SM_PM_A;
260   sm->page_addr = 0;
261   sm->byte_addr = 0;
262   sm->status = 0x40;
263   if (!image_is_writable(image))
264      sm->status |= 0x80;
265   sm->accumulated_status = 0;
266   sm->pagereg = auto_alloc_array(image->machine, UINT8, sm->page_total_size);
267   memcpy( sm->id, custom_header.data1, 3);
268   sm->mp_opcode = 0;
269
270   for (i=0;i<8;i++)
271   {
272      memcpy( sm->data_uid_ptr + i * 32, custom_header.data2, 16);
273      for (j=0;j<16;j++) sm->data_uid_ptr[i*32+16+j] = custom_header.data2[j] ^ 0xFF;
274   }
275   memcpy( sm->data_uid_ptr + 256, custom_header.data3, 16);
276
277   image_fread(image, sm->data_ptr, sm->page_total_size*sm->num_pages);
278
279   return INIT_PASS;
280}
281
282static DEVICE_IMAGE_LOAD( smartmedia )
283{
284   int result;
285   UINT64 position;
286   // try format 1
287   position = image_ftell( image);
288   result = DEVICE_IMAGE_LOAD_NAME(smartmedia_format_1)(image);
289   if (result != INIT_PASS)
290   {
291         // try format 2
292         image_fseek( image, position, SEEK_SET);
293         result = DEVICE_IMAGE_LOAD_NAME(smartmedia_format_2)(image);
294   }
295   return result;
296}
297
198298/*
199299    Unload a SmartMedia image
200300*/

Previous 15994 Revisions Next


© 1998-2018 The MESS Team