trunk/src/lib/formats/wd177x_dsk.c
| r20118 | r20119 | |
| 106 | 106 | } |
| 107 | 107 | } |
| 108 | 108 | |
| 109 | | floppy_image_format_t::desc_e* wd177x_format::get_desc_fm(const format &f, int ¤t_size) |
| 109 | floppy_image_format_t::desc_e* wd177x_format::get_desc_fm(const format &f, int ¤t_size, int &end_gap_index) |
| 110 | 110 | { |
| 111 | | static floppy_image_format_t::desc_e desc[25] = { |
| 111 | static floppy_image_format_t::desc_e desc[23] = { |
| 112 | 112 | /* 00 */ { FM, 0xff, f.gap_1 }, |
| 113 | 113 | /* 01 */ { SECTOR_LOOP_START, 0, f.sector_count-1 }, |
| 114 | 114 | /* 02 */ { FM, 0x00, 6 }, |
| 115 | 115 | /* 03 */ { CRC_CCITT_FM_START, 1 }, |
| 116 | | /* 04 */ { RAW, 0x4489, 0 }, // TODO remove |
| 117 | | /* 05 */ { FM, 0xfe, 1 }, |
| 118 | | /* 06 */ { TRACK_ID_FM }, |
| 119 | | /* 07 */ { HEAD_ID_FM }, |
| 120 | | /* 08 */ { SECTOR_ID_FM }, |
| 121 | | /* 09 */ { SIZE_ID_FM }, |
| 122 | | /* 10 */ { CRC_END, 1 }, |
| 123 | | /* 11 */ { CRC, 1 }, |
| 124 | | /* 12 */ { FM, 0xff, f.gap_2 }, |
| 125 | | /* 13 */ { FM, 0x00, 6 }, |
| 126 | | /* 14 */ { CRC_CCITT_FM_START, 2 }, |
| 127 | | /* 15 */ { RAW, 0x4489, 0 }, // TODO remove |
| 128 | | /* 16 */ { FM, 0xfb, 1 }, |
| 129 | | /* 17 */ { SECTOR_DATA_FM, -1 }, |
| 130 | | /* 18 */ { CRC_END, 2 }, |
| 131 | | /* 19 */ { CRC, 2 }, |
| 132 | | /* 20 */ { FM, 0xff, f.gap_3 }, |
| 133 | | /* 21 */ { SECTOR_LOOP_END }, |
| 134 | | /* 22 */ { FM, 0x00, 0 }, |
| 135 | | /* 23 */ { RAWBITS, 0x9254, 0 }, |
| 136 | | /* 24 */ { END } |
| 116 | /* 04 */ { FM, 0xfe, 1 }, |
| 117 | /* 05 */ { TRACK_ID_FM }, |
| 118 | /* 06 */ { HEAD_ID_FM }, |
| 119 | /* 07 */ { SECTOR_ID_FM }, |
| 120 | /* 08 */ { SIZE_ID_FM }, |
| 121 | /* 09 */ { CRC_END, 1 }, |
| 122 | /* 10 */ { CRC, 1 }, |
| 123 | /* 11 */ { FM, 0xff, f.gap_2 }, |
| 124 | /* 12 */ { FM, 0x00, 6 }, |
| 125 | /* 13 */ { CRC_CCITT_FM_START, 2 }, |
| 126 | /* 14 */ { FM, 0xfb, 1 }, |
| 127 | /* 15 */ { SECTOR_DATA_FM, -1 }, |
| 128 | /* 16 */ { CRC_END, 2 }, |
| 129 | /* 17 */ { CRC, 2 }, |
| 130 | /* 18 */ { FM, 0xff, f.gap_3 }, |
| 131 | /* 19 */ { SECTOR_LOOP_END }, |
| 132 | /* 20 */ { FM, 0x00, 0 }, |
| 133 | /* 21 */ { RAWBITS, 0xffff, 0 }, |
| 134 | /* 22 */ { END } |
| 137 | 135 | }; |
| 138 | 136 | |
| 139 | 137 | current_size = f.gap_1*16; |
| r20118 | r20119 | |
| 145 | 143 | } |
| 146 | 144 | current_size += (6+1+4+2+f.gap_2+6+1+2+f.gap_3) * f.sector_count * 16; |
| 147 | 145 | |
| 146 | end_gap_index = 20; |
| 147 | |
| 148 | 148 | return desc; |
| 149 | 149 | } |
| 150 | 150 | |
| 151 | | floppy_image_format_t::desc_e* wd177x_format::get_desc_mfm(const format &f, int ¤t_size) |
| 151 | floppy_image_format_t::desc_e* wd177x_format::get_desc_mfm(const format &f, int ¤t_size, int &end_gap_index) |
| 152 | 152 | { |
| 153 | 153 | static floppy_image_format_t::desc_e desc[25] = { |
| 154 | 154 | /* 00 */ { MFM, 0x4e, f.gap_1 }, |
| r20118 | r20119 | |
| 187 | 187 | } |
| 188 | 188 | current_size += (12+3+1+4+2+f.gap_2+12+3+1+2+f.gap_3) * f.sector_count * 16; |
| 189 | 189 | |
| 190 | end_gap_index = 22; |
| 191 | |
| 190 | 192 | return desc; |
| 191 | 193 | } |
| 192 | 194 | |
| r20118 | r20119 | |
| 199 | 201 | const format &f = formats[type]; |
| 200 | 202 | floppy_image_format_t::desc_e *desc; |
| 201 | 203 | int current_size; |
| 204 | int end_gap_index; |
| 202 | 205 | |
| 203 | 206 | switch (f.encoding) |
| 204 | 207 | { |
| 205 | 208 | case floppy_image::FM: |
| 206 | | desc = get_desc_fm(f, current_size); |
| 209 | desc = get_desc_fm(f, current_size, end_gap_index); |
| 207 | 210 | break; |
| 208 | 211 | case floppy_image::MFM: |
| 209 | 212 | default: |
| 210 | | desc = get_desc_mfm(f, current_size); |
| 213 | desc = get_desc_mfm(f, current_size, end_gap_index); |
| 211 | 214 | break; |
| 212 | 215 | } |
| 213 | 216 | |
| r20118 | r20119 | |
| 217 | 220 | throw emu_fatalerror("wd177x_format: Incorrect track layout, max_size=%d, current_size=%d", total_size, current_size); |
| 218 | 221 | |
| 219 | 222 | // Fixup the end gap |
| 220 | | desc[22].p2 = remaining_size / 16; |
| 221 | | desc[23].p2 = remaining_size & 15; |
| 222 | | desc[23].p1 >>= 16-(remaining_size & 15); |
| 223 | desc[end_gap_index].p2 = remaining_size / 16; |
| 224 | desc[end_gap_index + 1].p2 = remaining_size & 15; |
| 225 | desc[end_gap_index + 1].p1 >>= 16-(remaining_size & 15); |
| 223 | 226 | |
| 224 | 227 | int track_size = compute_track_size(f); |
| 225 | 228 | |