trunk/src/lib/formats/d81_dsk.c
| r20218 | r20219 | |
| 135 | 135 | {} |
| 136 | 136 | }; |
| 137 | 137 | |
| 138 | | bool d81_format::load(io_generic *io, UINT32 form_factor, floppy_image *image) |
| 138 | floppy_image_format_t::desc_e* d81_format::get_desc_mfm(const format &f, int ¤t_size, int &end_gap_index) |
| 139 | 139 | { |
| 140 | | int type = find_size(io, form_factor); |
| 141 | | if(type == -1) |
| 142 | | return false; |
| 140 | static floppy_image_format_t::desc_e desc[25] = { |
| 141 | /* 00 */ { MFM, 0x4e, f.gap_1 }, |
| 142 | /* 01 */ { SECTOR_LOOP_START, 0, f.sector_count-1 }, |
| 143 | /* 02 */ { MFM, 0x00, 12 }, |
| 144 | /* 03 */ { CRC_CCITT_START, 1 }, |
| 145 | /* 04 */ { RAW, 0x4489, 3 }, |
| 146 | /* 05 */ { MFM, 0xfe, 1 }, |
| 147 | /* 06 */ { TRACK_ID }, |
| 148 | /* 07 */ { HEAD_ID_SWAP }, |
| 149 | /* 08 */ { SECTOR_ID }, |
| 150 | /* 09 */ { SIZE_ID }, |
| 151 | /* 10 */ { CRC_END, 1 }, |
| 152 | /* 11 */ { CRC, 1 }, |
| 153 | /* 12 */ { MFM, 0x4e, f.gap_2 }, |
| 154 | /* 13 */ { MFM, 0x00, 12 }, |
| 155 | /* 14 */ { CRC_CCITT_START, 2 }, |
| 156 | /* 15 */ { RAW, 0x4489, 3 }, |
| 157 | /* 16 */ { MFM, 0xfb, 1 }, |
| 158 | /* 17 */ { SECTOR_DATA, -1 }, |
| 159 | /* 18 */ { CRC_END, 2 }, |
| 160 | /* 19 */ { CRC, 2 }, |
| 161 | /* 20 */ { MFM, 0x4e, f.gap_3 }, |
| 162 | /* 21 */ { SECTOR_LOOP_END }, |
| 163 | /* 22 */ { MFM, 0x4e, 0 }, |
| 164 | /* 23 */ { RAWBITS, 0x9254, 0 }, |
| 165 | /* 24 */ { END } |
| 166 | }; |
| 143 | 167 | |
| 144 | | const format &f = formats[type]; |
| 168 | current_size = f.gap_1*16; |
| 169 | if(f.sector_base_size) |
| 170 | current_size += f.sector_base_size * f.sector_count * 16; |
| 171 | else { |
| 172 | for(int j=0; j != f.sector_count; j++) |
| 173 | current_size += f.per_sector_size[j] * 16; |
| 174 | } |
| 175 | current_size += (12+3+1+4+2+f.gap_2+12+3+1+2+f.gap_3) * f.sector_count * 16; |
| 145 | 176 | |
| 146 | | floppy_image_format_t::desc_e desc[] = { |
| 147 | | /* 00 */ { MFM, 0x4e, f.gap_1 }, |
| 148 | | /* 01 */ { SECTOR_LOOP_START, 0, f.sector_count-1 }, |
| 149 | | /* 02 */ { MFM, 0x00, 12 }, |
| 150 | | /* 03 */ { CRC_CCITT_START, 1 }, |
| 151 | | /* 04 */ { RAW, 0x4489, 3 }, |
| 152 | | /* 05 */ { MFM, 0xfe, 1 }, |
| 153 | | /* 06 */ { TRACK_ID }, |
| 154 | | /* 07 */ { HEAD_ID_SWAP }, |
| 155 | | /* 08 */ { SECTOR_ID }, |
| 156 | | /* 09 */ { SIZE_ID }, |
| 157 | | /* 10 */ { CRC_END, 1 }, |
| 158 | | /* 11 */ { CRC, 1 }, |
| 159 | | /* 12 */ { MFM, 0x4e, f.gap_2 }, |
| 160 | | /* 13 */ { MFM, 0x00, 12 }, |
| 161 | | /* 14 */ { CRC_CCITT_START, 2 }, |
| 162 | | /* 15 */ { RAW, 0x4489, 3 }, |
| 163 | | /* 16 */ { MFM, 0xfb, 1 }, |
| 164 | | /* 17 */ { SECTOR_DATA, -1 }, |
| 165 | | /* 18 */ { CRC_END, 2 }, |
| 166 | | /* 19 */ { CRC, 2 }, |
| 167 | | /* 20 */ { MFM, 0x4e, f.gap_3 }, |
| 168 | | /* 21 */ { SECTOR_LOOP_END }, |
| 169 | | /* 22 */ { MFM, 0x4e, 0 }, |
| 170 | | /* 23 */ { RAWBITS, 0x9254, 0 }, |
| 171 | | /* 24 */ { END } |
| 172 | | }; |
| 177 | end_gap_index = 22; |
| 173 | 178 | |
| 174 | | int current_size = f.gap_1*16; |
| 175 | | if(f.sector_base_size) |
| 176 | | current_size += f.sector_base_size * f.sector_count * 16; |
| 177 | | else { |
| 178 | | for(int j=0; j != f.sector_count; j++) |
| 179 | | current_size += f.per_sector_size[j] * 16; |
| 180 | | } |
| 181 | | current_size += (12+3+1+4+2+f.gap_2+12+3+1+2+f.gap_3) * f.sector_count * 16; |
| 182 | | |
| 183 | | int total_size = 200000000/f.cell_size; |
| 184 | | int remaining_size = total_size - current_size; |
| 185 | | if(remaining_size < 0) |
| 186 | | throw emu_fatalerror("d81_format: Incorrect track layout, max_size=%d, current_size=%d", total_size, current_size); |
| 187 | | |
| 188 | | // Fixup the end gap |
| 189 | | desc[22].p2 = remaining_size / 16; |
| 190 | | desc[23].p2 = remaining_size & 15; |
| 191 | | desc[23].p1 >>= 16-(remaining_size & 15); |
| 192 | | |
| 193 | | int track_size = compute_track_size(f); |
| 194 | | |
| 195 | | UINT8 sectdata[40*512]; |
| 196 | | desc_s sectors[40]; |
| 197 | | build_sector_description(f, sectdata, sectors); |
| 198 | | |
| 199 | | for(int track=0; track < f.track_count; track++) |
| 200 | | for(int head=0; head < f.head_count; head++) { |
| 201 | | io_generic_read(io, sectdata, (track*f.head_count + !head)*track_size, track_size); |
| 202 | | generate_track(desc, track, head, sectors, f.sector_count, total_size, image); |
| 203 | | } |
| 204 | | |
| 205 | | image->set_variant(f.variant); |
| 206 | | |
| 207 | | return true; |
| 179 | return desc; |
| 208 | 180 | } |
| 209 | 181 | |
| 210 | 182 | const floppy_format_type FLOPPY_D81_FORMAT = &floppy_image_format_creator<d81_format>; |
trunk/src/mess/machine/c1581.c
| r20218 | r20219 | |
| 11 | 11 | |
| 12 | 12 | TODO: |
| 13 | 13 | |
| 14 | | - wd_fdc drops the busy bit too soon, c1581 aborts reading the sector ID after the first CRC byte @CD17 |
| 14 | - drive not ready if ready_r() is connected to CIA |
| 15 | - format fails (seeks to directory track and reports BAD DISK error) |
| 16 | - save fails (no error message, but no file added to directory either) |
| 15 | 17 | |
| 16 | 18 | */ |
| 17 | 19 | |
| r20218 | r20219 | |
| 117 | 119 | //------------------------------------------------- |
| 118 | 120 | |
| 119 | 121 | static ADDRESS_MAP_START( c1581_mem, AS_PROGRAM, 8, base_c1581_device ) |
| 120 | | AM_RANGE(0x0000, 0x1fff) AM_RAM |
| 122 | AM_RANGE(0x0000, 0x1fff) AM_MIRROR(0x2000) AM_RAM |
| 121 | 123 | AM_RANGE(0x4000, 0x400f) AM_MIRROR(0x1ff0) AM_DEVREADWRITE(M8520_TAG, mos8520_device, read, write) |
| 122 | 124 | AM_RANGE(0x6000, 0x6003) AM_MIRROR(0x1ffc) AM_DEVREADWRITE(WD1772_TAG, wd1772_t, read, write) |
| 123 | 125 | AM_RANGE(0x8000, 0xffff) AM_ROM AM_REGION(M6502_TAG, 0) |
| r20218 | r20219 | |
| 162 | 164 | UINT8 data = 0; |
| 163 | 165 | |
| 164 | 166 | // ready |
| 165 | | data |= !m_floppy->ready_r() << 1; |
| 167 | //data |= !m_floppy->ready_r() << 1; |
| 166 | 168 | |
| 167 | 169 | // device number |
| 168 | 170 | data |= (m_address - 8) << 3; |