src/mess/machine/c64.c
| r8728 | r8729 | |
| 1037 | 1037 | const char *filetype; |
| 1038 | 1038 | int address = 0, new_start = 0; |
| 1039 | 1039 | // 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); |
| 1041 | 1041 | |
| 1042 | 1042 | filetype = image.filetype(); |
| 1043 | 1043 | |
| r8728 | r8729 | |
| 1051 | 1051 | ; |
| 1052 | 1052 | |
| 1053 | 1053 | if (i >= ARRAY_LENGTH(c64_cbm_cart)) |
| 1054 | { |
| 1055 | auto_free(image.device().machine, temp_cart); |
| 1054 | 1056 | return IMAGE_INIT_FAIL; |
| 1055 | | |
| 1057 | } |
| 1058 | |
| 1056 | 1059 | /* Start to parse the .crt header */ |
| 1057 | 1060 | /* 0x16-0x17 is Hardware type */ |
| 1058 | 1061 | image.fseek(0x16, SEEK_SET); |
| 1059 | | image.fread( &c64_cart_type, 2); |
| 1062 | image.fread(&c64_cart_type, 2); |
| 1060 | 1063 | c64_cart_type = BIG_ENDIANIZE_INT16(c64_cart_type); |
| 1061 | 1064 | c64_mapper = c64_cart_type; |
| 1062 | 1065 | |
| r8728 | r8729 | |
| 1094 | 1097 | |
| 1095 | 1098 | /* 0x18 is EXROM */ |
| 1096 | 1099 | image.fseek(0x18, SEEK_SET); |
| 1097 | | image.fread( &cbm_c64_exrom, 1); |
| 1100 | image.fread(&cbm_c64_exrom, 1); |
| 1098 | 1101 | |
| 1099 | 1102 | /* 0x19 is GAME */ |
| 1100 | | image.fread( &cbm_c64_game, 1); |
| 1103 | image.fread(&cbm_c64_game, 1); |
| 1101 | 1104 | |
| 1102 | 1105 | /* We can pass to the data: it starts from 0x40 */ |
| 1103 | 1106 | image.fseek(0x40, SEEK_SET); |
| r8728 | r8729 | |
| 1118 | 1121 | |
| 1119 | 1122 | /* Start to parse the CHIP header */ |
| 1120 | 1123 | /* First 4 bytes are the string 'CHIP' */ |
| 1121 | | image.fread( buffer, 6); |
| 1124 | image.fread(buffer, 6); |
| 1122 | 1125 | |
| 1123 | 1126 | /* 0x06-0x07 is the size of the CHIP block (header + data) */ |
| 1124 | | image.fread( &chip_size, 2); |
| 1127 | image.fread(&chip_size, 2); |
| 1125 | 1128 | chip_size = BIG_ENDIANIZE_INT16(chip_size); |
| 1126 | 1129 | |
| 1127 | 1130 | /* 0x08-0x09 chip type (ROM, RAM + no ROM, Flash ROM) */ |
| 1128 | | image.fread( buffer + 6, 2); |
| 1131 | image.fread(buffer + 6, 2); |
| 1129 | 1132 | |
| 1130 | 1133 | /* 0x0a-0x0b is the bank number of the CHIP block */ |
| 1131 | | image.fread( &chip_bank_index, 2); |
| 1134 | image.fread(&chip_bank_index, 2); |
| 1132 | 1135 | chip_bank_index = BIG_ENDIANIZE_INT16(chip_bank_index); |
| 1133 | 1136 | |
| 1134 | 1137 | /* 0x0c-0x0d is the loading address of the CHIP block */ |
| 1135 | | image.fread( &address, 2); |
| 1138 | image.fread(&address, 2); |
| 1136 | 1139 | address = BIG_ENDIANIZE_INT16(address); |
| 1137 | 1140 | |
| 1138 | 1141 | /* 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); |
| 1140 | 1143 | chip_data_size = BIG_ENDIANIZE_INT16(chip_data_size); |
| 1141 | 1144 | |
| 1142 | 1145 | /* Print out the CHIP header! */ |
| r8728 | r8729 | |
| 1149 | 1152 | /* Does CHIP contain any data? */ |
| 1150 | 1153 | c64_cbm_cart[i].chip = (UINT8*) image.image_malloc(chip_data_size); |
| 1151 | 1154 | if (!c64_cbm_cart[i].chip) |
| 1155 | { |
| 1156 | auto_free(image.device().machine, temp_cart); |
| 1152 | 1157 | return IMAGE_INIT_FAIL; |
| 1153 | | |
| 1158 | } |
| 1159 | |
| 1154 | 1160 | /* Store data, address & size of the CHIP block */ |
| 1155 | 1161 | c64_cbm_cart[i].addr = address; |
| 1156 | 1162 | c64_cbm_cart[i].index = chip_bank_index; |
| 1157 | 1163 | c64_cbm_cart[i].size = chip_data_size; |
| 1158 | 1164 | c64_cbm_cart[i].start = new_start; |
| 1159 | 1165 | |
| 1160 | | test = image.fread( c64_cbm_cart[i].chip, chip_data_size); |
| 1166 | test = image.fread(c64_cbm_cart[i].chip, chip_data_size); |
| 1161 | 1167 | |
| 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); |
| 1163 | 1169 | new_start += c64_cbm_cart[i].size; |
| 1164 | 1170 | |
| 1165 | 1171 | if (test != chip_data_size) |
| 1172 | { |
| 1173 | auto_free(image.device().machine, temp_cart); |
| 1166 | 1174 | return IMAGE_INIT_FAIL; |
| 1167 | | |
| 1175 | } |
| 1176 | |
| 1168 | 1177 | /* Advance to the next CHIP block */ |
| 1169 | 1178 | i++; |
| 1170 | 1179 | j += chip_size; |
| r8728 | r8729 | |
| 1187 | 1196 | /* Does cart contain any data? */ |
| 1188 | 1197 | c64_cbm_cart[0].chip = (UINT8*) image.image_malloc(size); |
| 1189 | 1198 | if (!c64_cbm_cart[0].chip) |
| 1199 | { |
| 1200 | auto_free(image.device().machine, temp_cart); |
| 1190 | 1201 | return IMAGE_INIT_FAIL; |
| 1191 | | |
| 1202 | } |
| 1203 | |
| 1192 | 1204 | /* Store data, address & size */ |
| 1193 | 1205 | c64_cbm_cart[0].addr = address; |
| 1194 | 1206 | c64_cbm_cart[0].size = size; |
| 1195 | 1207 | c64_cbm_cart[0].start = new_start; |
| 1196 | 1208 | |
| 1197 | | test = image.fread( c64_cbm_cart[0].chip, size); |
| 1209 | test = image.fread(c64_cbm_cart[0].chip, size); |
| 1198 | 1210 | |
| 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); |
| 1200 | 1212 | new_start += c64_cbm_cart[0].size; |
| 1201 | 1213 | |
| 1202 | 1214 | if (test != c64_cbm_cart[0].size) |
| 1215 | { |
| 1216 | auto_free(image.device().machine, temp_cart); |
| 1203 | 1217 | return IMAGE_INIT_FAIL; |
| 1218 | } |
| 1204 | 1219 | } |
| 1205 | 1220 | |
| 1206 | 1221 | n_banks = i; |
| r8728 | r8729 | |
| 1222 | 1237 | switch (c64_mapper) |
| 1223 | 1238 | { |
| 1224 | 1239 | case ZAXXON: |
| 1225 | | memcpy(romh, cart + 0x1000, 0x2000); |
| 1240 | memcpy(romh, temp_cart + 0x1000, 0x2000); |
| 1226 | 1241 | break; |
| 1227 | 1242 | default: |
| 1228 | 1243 | if (!c64_game && c64_exrom && (n_banks == 1)) |
| 1229 | | memcpy(romh, cart, 0x2000); |
| 1244 | memcpy(romh, temp_cart, 0x2000); |
| 1230 | 1245 | else |
| 1231 | 1246 | { |
| 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); |
| 1234 | 1249 | } |
| 1235 | 1250 | } |
| 1236 | 1251 | |
| 1237 | 1252 | c64_cart_n_banks = n_banks; // this is needed so that we only set mappers if a cart is present! |
| 1238 | 1253 | |
| 1254 | memcpy(memory_region(image.device().machine, "user1"), temp_cart, size); |
| 1255 | auto_free(image.device().machine, temp_cart); |
| 1239 | 1256 | return IMAGE_INIT_PASS; |
| 1240 | 1257 | } |
| 1241 | 1258 | |