src/mess/machine/smartmed.c
| r6546 | r6547 | |
| 56 | 56 | UINT32BE log2_pages_per_block; |
| 57 | 57 | } disk_image_header; |
| 58 | 58 | |
| 59 | typedef 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 | |
| 59 | 68 | enum |
| 60 | 69 | { |
| 61 | 70 | header_len = sizeof(disk_image_header) |
| r6546 | r6547 | |
| 144 | 153 | /* |
| 145 | 154 | Load a SmartMedia image |
| 146 | 155 | */ |
| 147 | | static DEVICE_IMAGE_LOAD( smartmedia ) |
| 156 | static DEVICE_IMAGE_LOAD( smartmedia_format_1 ) |
| 148 | 157 | { |
| 149 | 158 | smartmedia_t *sm = get_safe_token(image); |
| 150 | 159 | disk_image_header custom_header; |
| r6546 | r6547 | |
| 195 | 204 | return INIT_PASS; |
| 196 | 205 | } |
| 197 | 206 | |
| 207 | static 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 | |
| 234 | static 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 | |
| 282 | static 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 | |
| 198 | 298 | /* |
| 199 | 299 | Unload a SmartMedia image |
| 200 | 300 | */ |