Previous 15994 Revisions Next

r6537 Friday 4th December, 2009 at 22:16:32 UTC by Tim Schuerewegen
Added support for command 30/65 (unique id) to the SmartMedia device and fixed a READID bug. These two changes allow the GP32 driver to load copy protected games from SmartMedia cards.
[src/mess/machine]smartmed.c

src/mess/machine/smartmed.c
r6536r6537
7272   int log2_pages_per_block;   // log2 of number of pages per erase block (usually 4 or 5)
7373
7474   UINT8 *data_ptr;   // FEEPROM data area
75   UINT8 *data_uid_ptr;
7576
7677   enum
7778   {
r6536r6537
8081      SM_M_PROGRAM,   // program page data
8182      SM_M_ERASE,      // erase block data
8283      SM_M_READSTATUS,// read status
83      SM_M_READID      // read ID
84      SM_M_READID,      // read ID
85      SM_M_30
8486   } mode;            // current operation mode
8587   enum
8688   {
r6536r6537
9799   int accumulated_status;   // accumulated status
98100
99101   UINT8 *pagereg;   // page register used by program command
100   UINT8 id[2];      // chip ID
102   UINT8 id[3];      // chip ID
101103   UINT8 mp_opcode;   // multi-plane operation code
104   
105   int mode_3065;
102106};
103107
104108
r6536r6537
124128   sm->num_pages = 0;
125129   sm->log2_pages_per_block = 0;
126130   sm->data_ptr = NULL;
131   sm->data_uid_ptr = NULL;
127132   sm->mode = SM_M_INIT;
128133   sm->pointer_mode = SM_PM_A;
129134   sm->page_addr = 0;
r6536r6537
131136   sm->status = 0x40;
132137   sm->accumulated_status = 0;
133138   sm->pagereg = NULL;
134   sm->id[0] = sm->id[1] = 0;
139   sm->id[0] = sm->id[1] = sm->id[2] = 0;
135140   sm->mp_opcode = 0;
141   sm->mode_3065 = 0;
136142}
137143
138144/*
r6536r6537
151157      return INIT_FAIL;
152158   }
153159
154   if (custom_header.version != 0)
160   if (custom_header.version > 1)
155161   {
156162      return INIT_FAIL;
157163   }
r6536r6537
161167   sm->num_pages = get_UINT32BE(custom_header.num_pages);
162168   sm->log2_pages_per_block = get_UINT32BE(custom_header.log2_pages_per_block);
163169   sm->data_ptr = auto_alloc_array(image->machine, UINT8, sm->page_total_size*sm->num_pages);
170   sm->data_uid_ptr = auto_alloc_array(image->machine, UINT8, 256 + 16);
164171   sm->mode = SM_M_INIT;
165172   sm->pointer_mode = SM_PM_A;
166173   sm->page_addr = 0;
r6536r6537
170177      sm->status |= 0x80;
171178   sm->accumulated_status = 0;
172179   sm->pagereg = auto_alloc_array(image->machine, UINT8, sm->page_total_size);
173   sm->id[0] = sm->id[1] = 0;
180   sm->id[0] = sm->id[1] = sm->id[2] = 0;
174181
175   image_fread(image, sm->id, 2);
176   image_fread(image, &sm->mp_opcode, 1);
182   if (custom_header.version == 0)
183   {
184      image_fread(image, sm->id, 2);
185      image_fread(image, &sm->mp_opcode, 1);
186   }
187   else if (custom_header.version == 1)
188   {
189      image_fread(image, sm->id, 3);
190      image_fread(image, &sm->mp_opcode, 1);
191      image_fread(image, sm->data_uid_ptr, 256 + 16);
192   }
177193   image_fread(image, sm->data_ptr, sm->page_total_size*sm->num_pages);
178194
179195   return INIT_PASS;
r6536r6537
191207   sm->num_pages = 0;
192208   sm->log2_pages_per_block = 0;
193209   sm->data_ptr = NULL;
210   sm->data_uid_ptr = NULL;
194211   sm->mode = SM_M_INIT;
195212   sm->pointer_mode = SM_PM_A;
196213   sm->page_addr = 0;
r6536r6537
198215   sm->status = 0x40;
199216   sm->accumulated_status = 0;
200217   sm->pagereg = auto_alloc_array(image->machine, UINT8, sm->page_total_size);
201   sm->id[0] = sm->id[1] = 0;
218   sm->id[0] = sm->id[1] = sm->id[2] = 0;
202219   sm->mp_opcode = 0;
220   sm->mode_3065 = 0;
203221
204222   return;
205223}
r6536r6537
233251      sm->pointer_mode = SM_PM_A;
234252      sm->status = (sm->status & 0x80) | 0x40;
235253      sm->accumulated_status = 0;
254      sm->mode_3065 = 0;
236255      break;
237256   case 0x00:
238257      sm->mode = SM_M_READ;
r6536r6537
317336        break;*/
318337   case 0x90:
319338      sm->mode = SM_M_READID;
339      sm->addr_load_ptr = 0;
320340      break;
321341   /*case 0x91:
322342        break;*/
343   case 0x30:
344      sm->mode = SM_M_30;
345      break;
346   case 0x65:
347      if (sm->mode != SM_M_30)
348      {
349         logerror("smartmedia: unexpected address port write\n");
350         sm->mode = SM_M_INIT;
351      }
352      else
353      {
354         sm->mode_3065 = 1;
355      }
356      break;
323357   default:
324358      logerror("smartmedia: unsupported command 0x%02x\n", data);
325359      sm->mode = SM_M_INIT;
r6536r6537
356390            sm->pointer_mode = SM_PM_A;
357391            break;
358392         case SM_PM_C:
359            sm->byte_addr = (data & 0x0f) + sm->page_data_size;
393            if (!sm->mode_3065)
394               sm->byte_addr = (data & 0x0f) + sm->page_data_size;
395            else
396               sm->byte_addr = (data & 0x0f) + 256;
360397            break;
361398         }
362399      }
r6536r6537
371408      sm->addr_load_ptr++;
372409      break;
373410   case SM_M_READSTATUS:
411   case SM_M_30:
374412      logerror("smartmedia: unexpected address port write\n");
375413      break;
376414   case SM_M_READID:
r6536r6537
395433   switch (sm->mode)
396434   {
397435   case SM_M_INIT:
436   case SM_M_30:
398437      logerror("smartmedia: unexpected data port read\n");
399438      break;
400439   case SM_M_READ:
401      reply = sm->data_ptr[sm->page_addr*sm->page_total_size + sm->byte_addr];
440      if (!sm->mode_3065)
441         reply = sm->data_ptr[sm->page_addr*sm->page_total_size + sm->byte_addr];
442      else
443         reply = sm->data_uid_ptr[sm->page_addr*sm->page_total_size + sm->byte_addr];
402444      sm->byte_addr++;
403445      if (sm->byte_addr == sm->page_total_size)
404446      {
r6536r6537
418460      reply = sm->status & 0xc1;
419461      break;
420462   case SM_M_READID:
421      if (sm->byte_addr < 2)
463      if (sm->byte_addr < 3)
422464         reply = sm->id[sm->byte_addr];
465      sm->byte_addr++;
423466      break;
424467   }
425468
r6536r6537
440483   {
441484   case SM_M_INIT:
442485   case SM_M_READ:
486   case SM_M_30:
443487      logerror("smartmedia: unexpected data port write\n");
444488      break;
445489   case SM_M_PROGRAM:

Previous 15994 Revisions Next


© 1998-2018 The MESS Team