src/mess/formats/coupedsk.c
| r0 | r2233 | |
| 1 | /************************************************************************* |
| 2 | |
| 3 | formats/coupedsk.c |
| 4 | |
| 5 | SAM Coupe disk image formats |
| 6 | |
| 7 | **************************************************************************/ |
| 8 | |
| 9 | #include "coupedsk.h" |
| 10 | #include "formats/basicdsk.h" |
| 11 | |
| 12 | |
| 13 | #define SAD_HEADER_LEN 22 |
| 14 | |
| 15 | |
| 16 | |
| 17 | /************************************* |
| 18 | * |
| 19 | * MGT disk image format |
| 20 | * |
| 21 | *************************************/ |
| 22 | |
| 23 | /* |
| 24 | Straight rip without any header |
| 25 | |
| 26 | Data: |
| 27 | |
| 28 | Side 0 Track 0 |
| 29 | Side 1 Track 0 |
| 30 | Side 0 Track 1 |
| 31 | Side 1 Track 1 |
| 32 | ... |
| 33 | */ |
| 34 | |
| 35 | |
| 36 | FLOPPY_CONSTRUCT( coupe_mgt_construct ) |
| 37 | { |
| 38 | struct basicdsk_geometry geometry; |
| 39 | |
| 40 | memset(&geometry, 0, sizeof(geometry)); |
| 41 | geometry.heads = 2; |
| 42 | geometry.tracks = 80; |
| 43 | geometry.sector_length = 512; |
| 44 | geometry.first_sector_id = 1; |
| 45 | |
| 46 | if (params) |
| 47 | { |
| 48 | /* create */ |
| 49 | geometry.sectors = option_resolution_lookup_int(params, PARAM_SECTORS); |
| 50 | } |
| 51 | else |
| 52 | { |
| 53 | /* load */ |
| 54 | UINT64 size = floppy_image_size(floppy); |
| 55 | |
| 56 | /* verify size */ |
| 57 | if (size != 737280 && size != 819200) |
| 58 | return FLOPPY_ERROR_INVALIDIMAGE; |
| 59 | |
| 60 | geometry.sectors = size / 81920; |
| 61 | |
| 62 | } |
| 63 | |
| 64 | return basicdsk_construct(floppy, &geometry); |
| 65 | } |
| 66 | |
| 67 | |
| 68 | FLOPPY_IDENTIFY( coupe_mgt_identify ) |
| 69 | { |
| 70 | UINT64 size; |
| 71 | |
| 72 | size = floppy_image_size(floppy); |
| 73 | |
| 74 | *vote = (size == 737280 || size == 819200) ? 100 : 0; |
| 75 | return FLOPPY_ERROR_SUCCESS; |
| 76 | } |
| 77 | |
| 78 | |
| 79 | |
| 80 | /************************************* |
| 81 | * |
| 82 | * SAD disk image format |
| 83 | * |
| 84 | *************************************/ |
| 85 | |
| 86 | /* |
| 87 | Header (22 bytes): |
| 88 | |
| 89 | 0-17 "Aley's disk backup" |
| 90 | 18 number of sides |
| 91 | 19 number of tracks |
| 92 | 20 number of sectors per track |
| 93 | 21 sector size divided by 64 |
| 94 | |
| 95 | Data: |
| 96 | |
| 97 | Side 0 Track 0 |
| 98 | Side 0 Track 1 |
| 99 | Side 0 Track 2 |
| 100 | ... |
| 101 | Side 1 Track 0 |
| 102 | Side 1 Track 1 |
| 103 | ... |
| 104 | */ |
| 105 | |
| 106 | |
| 107 | static UINT64 coupe_sad_translate_offset(floppy_image *floppy, |
| 108 | const struct basicdsk_geometry *geom, int track, int head, int sector) |
| 109 | { |
| 110 | return head * geom->tracks * geom->sectors + geom->sectors * track + sector; |
| 111 | } |
| 112 | |
| 113 | |
| 114 | static void coupe_sad_interpret_header(floppy_image *floppy, |
| 115 | int *heads, int *tracks, int *sectors, int *sector_size) |
| 116 | { |
| 117 | UINT8 header[SAD_HEADER_LEN]; |
| 118 | |
| 119 | floppy_image_read(floppy, header, 0, SAD_HEADER_LEN); |
| 120 | |
| 121 | *heads = header[18]; |
| 122 | *tracks = header[19]; |
| 123 | *sectors = header[20]; |
| 124 | *sector_size = header[21] << 6; |
| 125 | } |
| 126 | |
| 127 | |
| 128 | FLOPPY_CONSTRUCT( coupe_sad_construct ) |
| 129 | { |
| 130 | struct basicdsk_geometry geometry; |
| 131 | int heads, tracks, sectors, sector_length; |
| 132 | |
| 133 | memset(&geometry, 0, sizeof(geometry)); |
| 134 | |
| 135 | if (params) |
| 136 | { |
| 137 | /* create */ |
| 138 | heads = option_resolution_lookup_int(params, PARAM_HEADS); |
| 139 | tracks = option_resolution_lookup_int(params, PARAM_TRACKS); |
| 140 | sectors = option_resolution_lookup_int(params, PARAM_SECTORS); |
| 141 | sector_length = option_resolution_lookup_int(params, PARAM_SECTOR_LENGTH); |
| 142 | } |
| 143 | else |
| 144 | { |
| 145 | /* load */ |
| 146 | coupe_sad_interpret_header(floppy, &heads, &tracks, §ors, §or_length); |
| 147 | } |
| 148 | |
| 149 | /* fill in the data */ |
| 150 | geometry.offset = SAD_HEADER_LEN; |
| 151 | geometry.heads = heads; |
| 152 | geometry.tracks = tracks; |
| 153 | geometry.sectors = sectors; |
| 154 | geometry.first_sector_id = 1; |
| 155 | geometry.sector_length = sector_length; |
| 156 | geometry.translate_offset = coupe_sad_translate_offset; |
| 157 | |
| 158 | return basicdsk_construct(floppy, &geometry); |
| 159 | } |
| 160 | |
| 161 | |
| 162 | FLOPPY_IDENTIFY( coupe_sad_identify ) |
| 163 | { |
| 164 | int heads, tracks, sectors, sector_size; |
| 165 | UINT64 size, calculated_size; |
| 166 | |
| 167 | size = floppy_image_size(floppy); |
| 168 | |
| 169 | /* read values from SAD header */ |
| 170 | coupe_sad_interpret_header(floppy, &heads, &tracks, §ors, §or_size); |
| 171 | |
| 172 | /* calculate expected disk image size */ |
| 173 | calculated_size = SAD_HEADER_LEN + heads * tracks * sectors * sector_size; |
| 174 | |
| 175 | *vote = (size == calculated_size) ? 100 : 0; |
| 176 | return FLOPPY_ERROR_SUCCESS; |
| 177 | } |
| 178 | |
| 179 | |
| 180 | |
| 181 | /************************************* |
| 182 | * |
| 183 | * SDF disk image format |
| 184 | * |
| 185 | *************************************/ |
| 186 | |
| 187 | FLOPPY_CONSTRUCT( coupe_sdf_construct ) |
| 188 | { |
| 189 | return FLOPPY_ERROR_INVALIDIMAGE; |
| 190 | } |
| 191 | |
| 192 | |
| 193 | FLOPPY_IDENTIFY( coupe_sdf_identify ) |
| 194 | { |
| 195 | *vote = 0; |
| 196 | return FLOPPY_ERROR_SUCCESS; |
| 197 | } |
| 198 | |
| 199 | |
| 200 | |
| 201 | /************************************* |
| 202 | * |
| 203 | * Floppy options |
| 204 | * |
| 205 | *************************************/ |
| 206 | |
| 207 | FLOPPY_OPTIONS_START(coupe) |
| 208 | FLOPPY_OPTION |
| 209 | ( |
| 210 | coupe_mgt, "mgt,dsk,sad", "SAM Coupe MGT disk image", coupe_mgt_identify, coupe_mgt_construct, |
| 211 | HEADS([2]) |
| 212 | TRACKS([80]) |
| 213 | SECTORS(9-[10]) |
| 214 | SECTOR_LENGTH([512]) |
| 215 | FIRST_SECTOR_ID([1]) |
| 216 | ) |
| 217 | FLOPPY_OPTION |
| 218 | ( |
| 219 | coupe_sad, "sad", "SAM Coupe SAD disk image", coupe_sad_identify, coupe_sad_construct, |
| 220 | HEADS(1-[2]-255) |
| 221 | TRACKS(1-[80]-255) |
| 222 | SECTORS(1-[10]-255) |
| 223 | SECTOR_LENGTH(64/128/256/[512]/1024/2048/4096) |
| 224 | FIRST_SECTOR_ID([1]) |
| 225 | ) |
| 226 | FLOPPY_OPTION |
| 227 | ( |
| 228 | coupe_sdf, "sdf", "SAM Coupe SDF disk image", coupe_sdf_identify, coupe_sdf_construct, |
| 229 | HEADS([2]) |
| 230 | TRACKS([80]) |
| 231 | SECTORS([10]) |
| 232 | SECTOR_LENGTH([512]) |
| 233 | FIRST_SECTOR_ID([1]) |
| 234 | ) |
| 235 | FLOPPY_OPTIONS_END |
src/mess/drivers/coupe.c
| r2232 | r2233 | |
| 62 | 62 | #include "sound/speaker.h" |
| 63 | 63 | |
| 64 | 64 | /* devices */ |
| 65 | | #include "devices/basicdsk.h" |
| 65 | #include "devices/mflopimg.h" |
| 66 | #include "formats/coupedsk.h" |
| 66 | 67 | |
| 67 | 68 | |
| 68 | 69 | #define COUPE_XTAL_X1 XTAL_24MHz |
| r2232 | r2233 | |
| 583 | 584 | case MESS_DEVINFO_INT_COUNT: info->i = 2; break; |
| 584 | 585 | |
| 585 | 586 | /* --- the following bits of info are returned as pointers to data or functions --- */ |
| 586 | | case MESS_DEVINFO_PTR_LOAD: info->load = DEVICE_IMAGE_LOAD_NAME(coupe_floppy); break; |
| 587 | case MESS_DEVINFO_PTR_FLOPPY_OPTIONS: info->p = (void *) floppyoptions_coupe; break; |
| 587 | 588 | |
| 588 | 589 | /* --- the following bits of info are returned as NULL-terminated strings --- */ |
| 589 | | case MESS_DEVINFO_STR_FILE_EXTENSIONS: strcpy(info->s = device_temp_str(), "dsk,sad"); break; |
| 590 | case MESS_DEVINFO_STR_NAME+0: strcpy(info->s = device_temp_str(), "floppydisk0"); break; |
| 591 | case MESS_DEVINFO_STR_NAME+1: strcpy(info->s = device_temp_str(), "floppydisk1"); break; |
| 592 | case MESS_DEVINFO_STR_SHORT_NAME+0: strcpy(info->s = device_temp_str(), "flop0"); break; |
| 593 | case MESS_DEVINFO_STR_SHORT_NAME+1: strcpy(info->s = device_temp_str(), "flop1"); break; |
| 594 | case MESS_DEVINFO_STR_DESCRIPTION+0: strcpy(info->s = device_temp_str(), "Floppy #0"); break; |
| 595 | case MESS_DEVINFO_STR_DESCRIPTION+1: strcpy(info->s = device_temp_str(), "Floppy #1"); break; |
| 590 | 596 | |
| 591 | | default: legacybasicdsk_device_getinfo(devclass, state, info); break; |
| 597 | default: floppy_device_getinfo(devclass, state, info); break; |
| 592 | 598 | } |
| 593 | 599 | } |
| 594 | 600 | |