Previous 15994 Revisions Next

r8729 Saturday 7th August, 2010 at 12:04:01 UTC by Fabio Priuli
[MAX] possible workaround for issues when loading carts not using softlist
[src/mess/machine]c64.c

src/mess/machine/c64.c
r8728r8729
10371037   const char *filetype;
10381038   int address = 0, new_start = 0;
10391039   // int lbank_end_addr = 0, hbank_end_addr = 0;
1040   UINT8 *cart = memory_region(image.device().machine, "user1");
1040   UINT8 *temp_cart = auto_alloc_array(image.device().machine, UINT8, size);
10411041
10421042   filetype = image.filetype();
10431043
r8728r8729
10511051      ;
10521052
10531053      if (i >= ARRAY_LENGTH(c64_cbm_cart))
1054      {
1055         auto_free(image.device().machine, temp_cart);
10541056         return IMAGE_INIT_FAIL;
1055
1057      }
1058     
10561059      /* Start to parse the .crt header */
10571060      /* 0x16-0x17 is Hardware type */
10581061      image.fseek(0x16, SEEK_SET);
1059      image.fread( &c64_cart_type, 2);
1062      image.fread(&c64_cart_type, 2);
10601063      c64_cart_type = BIG_ENDIANIZE_INT16(c64_cart_type);
10611064      c64_mapper = c64_cart_type;
10621065
r8728r8729
10941097
10951098      /* 0x18 is EXROM */
10961099      image.fseek(0x18, SEEK_SET);
1097      image.fread( &cbm_c64_exrom, 1);
1100      image.fread(&cbm_c64_exrom, 1);
10981101
10991102      /* 0x19 is GAME */
1100      image.fread( &cbm_c64_game, 1);
1103      image.fread(&cbm_c64_game, 1);
11011104
11021105      /* We can pass to the data: it starts from 0x40 */
11031106      image.fseek(0x40, SEEK_SET);
r8728r8729
11181121
11191122         /* Start to parse the CHIP header */
11201123         /* First 4 bytes are the string 'CHIP' */
1121         image.fread( buffer, 6);
1124         image.fread(buffer, 6);
11221125
11231126         /* 0x06-0x07 is the size of the CHIP block (header + data) */
1124         image.fread( &chip_size, 2);
1127         image.fread(&chip_size, 2);
11251128         chip_size = BIG_ENDIANIZE_INT16(chip_size);
11261129
11271130         /* 0x08-0x09 chip type (ROM, RAM + no ROM, Flash ROM) */
1128         image.fread( buffer + 6, 2);
1131         image.fread(buffer + 6, 2);
11291132
11301133         /* 0x0a-0x0b is the bank number of the CHIP block */
1131         image.fread( &chip_bank_index, 2);
1134         image.fread(&chip_bank_index, 2);
11321135         chip_bank_index = BIG_ENDIANIZE_INT16(chip_bank_index);
11331136
11341137         /* 0x0c-0x0d is the loading address of the CHIP block */
1135         image.fread( &address, 2);
1138         image.fread(&address, 2);
11361139         address = BIG_ENDIANIZE_INT16(address);
11371140
11381141         /* 0x0e-0x0f is the data size of the CHIP block (without header) */
1139         image.fread( &chip_data_size, 2);
1142         image.fread(&chip_data_size, 2);
11401143         chip_data_size = BIG_ENDIANIZE_INT16(chip_data_size);
11411144
11421145         /* Print out the CHIP header! */
r8728r8729
11491152         /* Does CHIP contain any data? */
11501153         c64_cbm_cart[i].chip = (UINT8*) image.image_malloc(chip_data_size);
11511154         if (!c64_cbm_cart[i].chip)
1155         {
1156            auto_free(image.device().machine, temp_cart);
11521157            return IMAGE_INIT_FAIL;
1153
1158         }
1159         
11541160         /* Store data, address & size of the CHIP block */
11551161         c64_cbm_cart[i].addr = address;
11561162         c64_cbm_cart[i].index = chip_bank_index;
11571163         c64_cbm_cart[i].size = chip_data_size;
11581164         c64_cbm_cart[i].start = new_start;
11591165
1160         test = image.fread( c64_cbm_cart[i].chip, chip_data_size);
1166         test = image.fread(c64_cbm_cart[i].chip, chip_data_size);
11611167
1162         memcpy(&cart[new_start], c64_cbm_cart[i].chip, c64_cbm_cart[i].size);
1168         memcpy(&temp_cart[new_start], c64_cbm_cart[i].chip, c64_cbm_cart[i].size);
11631169         new_start += c64_cbm_cart[i].size;
11641170
11651171         if (test != chip_data_size)
1172         {
1173            auto_free(image.device().machine, temp_cart);
11661174            return IMAGE_INIT_FAIL;
1167
1175         }
1176         
11681177         /* Advance to the next CHIP block */
11691178         i++;
11701179         j += chip_size;
r8728r8729
11871196      /* Does cart contain any data? */
11881197      c64_cbm_cart[0].chip = (UINT8*) image.image_malloc(size);
11891198      if (!c64_cbm_cart[0].chip)
1199      {
1200         auto_free(image.device().machine, temp_cart);
11901201         return IMAGE_INIT_FAIL;
1191
1202      }
1203     
11921204      /* Store data, address & size */
11931205      c64_cbm_cart[0].addr = address;
11941206      c64_cbm_cart[0].size = size;
11951207      c64_cbm_cart[0].start = new_start;
11961208
1197      test = image.fread( c64_cbm_cart[0].chip, size);
1209      test = image.fread(c64_cbm_cart[0].chip, size);
11981210
1199      memcpy(&cart[new_start], c64_cbm_cart[0].chip, c64_cbm_cart[0].size);
1211      memcpy(&temp_cart[new_start], c64_cbm_cart[0].chip, c64_cbm_cart[0].size);
12001212      new_start += c64_cbm_cart[0].size;
12011213
12021214      if (test != c64_cbm_cart[0].size)
1215      {
1216         auto_free(image.device().machine, temp_cart);
12031217         return IMAGE_INIT_FAIL;
1218      }
12041219   }
12051220
12061221   n_banks = i;
r8728r8729
12221237   switch (c64_mapper)
12231238   {
12241239   case ZAXXON:
1225      memcpy(romh, cart + 0x1000, 0x2000);
1240      memcpy(romh, temp_cart + 0x1000, 0x2000);
12261241      break;
12271242   default:
12281243      if (!c64_game && c64_exrom && (n_banks == 1))
1229         memcpy(romh, cart, 0x2000);
1244         memcpy(romh, temp_cart, 0x2000);
12301245      else
12311246      {
1232         memcpy(roml, cart + 0 * 0x2000, 0x2000);
1233         memcpy(romh, cart + 1 * 0x2000, 0x2000);
1247         memcpy(roml, temp_cart + 0 * 0x2000, 0x2000);
1248         memcpy(romh, temp_cart + 1 * 0x2000, 0x2000);
12341249      }
12351250   }
12361251
12371252   c64_cart_n_banks = n_banks; // this is needed so that we only set mappers if a cart is present!
12381253
1254   memcpy(memory_region(image.device().machine, "user1"), temp_cart, size);
1255   auto_free(image.device().machine, temp_cart);
12391256   return IMAGE_INIT_PASS;
12401257}
12411258

Previous 15994 Revisions Next


© 1998-2018 The MESS Team