| Previous | 199869 Revisions | Next |
| r20133 Tuesday 8th January, 2013 at 17:57:56 UTC by Curt Coder |
|---|
| Added FM encoding support to upd765_dsk. [Curt Coder] (MESS) bw2: Fixed floppy loading. [Curt Coder] |
| [src/emu/machine] | upd765.c wd_fdc.c |
| [src/lib/formats] | a5105_dsk.c apollo_dsk.c bw12_dsk.c bw2_dsk.c iq151_dsk.c kc85_dsk.c m5_dsk.c mm_dsk.c nanos_dsk.c pc_dsk.c pyldin_dsk.c sf7000_dsk.c upd765_dsk.c upd765_dsk.h xdf_dsk.c |
| [src/mess/drivers] | bw12.c bw2.c |
| [src/mess/includes] | bw12.h |
| [src/mess/machine] | comx_fd.c |
| r20132 | r20133 | |
|---|---|---|
| 385 | 385 | if(cmd == C_INVALID) { |
| 386 | 386 | logerror("%s: Invalid on %02x\n", tag(), command[0]); |
| 387 | 387 | main_phase = PHASE_RESULT; |
| 388 | result[0] = 0 | |
| 388 | result[0] = ST0_UNK; | |
| 389 | 389 | result_pos = 1; |
| 390 | 390 | return; |
| 391 | 391 | } |
| r20132 | r20133 | |
|---|---|---|
| 1383 | 1383 | cur_live.state = READ_HEADER_BLOCK_HEADER; |
| 1384 | 1384 | } |
| 1385 | 1385 | |
| 1386 | if(dden && (cur_live.shift_reg == 0xf57e || cur_live.shift_reg == 0xf57 | |
| 1386 | if(dden && (cur_live.shift_reg == 0xf57e || cur_live.shift_reg == 0xf57f)) { | |
| 1387 | 1387 | cur_live.crc = cur_live.shift_reg == 0xf57e ? 0xef21 : 0xff00; |
| 1388 | 1388 | cur_live.data_separator_phase = false; |
| 1389 | 1389 | cur_live.bit_counter = 0; |
| r20132 | r20133 | |
| 1860 | 1860 | cur_live.byte_counter = 0; |
| 1861 | 1861 | cur_live.data_bit_context = cur_live.data_reg & 1; |
| 1862 | 1862 | pll_start_writing(cur_live.tm); |
| 1863 | if(dden) | |
| 1864 | live_write_fm(0x00); | |
| 1863 | live_write_fm(0x00); | |
| 1865 | 1864 | } |
| 1866 | 1865 | break; |
| 1867 | 1866 | |
| r20132 | r20133 | |
| 1971 | 1970 | void wd_fdc_digital_t::pll_reset(bool fm, attotime when) |
| 1972 | 1971 | { |
| 1973 | 1972 | cur_pll.reset(when); |
| 1974 | cur_pll.set_clock(clocks_to_attotime(1)); | |
| 1973 | cur_pll.set_clock(clocks_to_attotime(fm ? 2 : 1)); // HACK | |
| 1975 | 1974 | } |
| 1976 | 1975 | |
| 1977 | 1976 | void wd_fdc_digital_t::pll_start_writing(attotime tm) |
| r20132 | r20133 | |
|---|---|---|
| 64 | 64 | // Unverified gap sizes |
| 65 | 65 | const xdf_format::format xdf_format::formats[] = { |
| 66 | 66 | { |
| 67 | floppy_image::FF_525, floppy_image::DSHD, | |
| 67 | floppy_image::FF_525, floppy_image::DSHD, floppy_image::MFM, | |
| 68 | 68 | 1200, // 1us, 360rpm |
| 69 | 69 | 8, 77, 2, |
| 70 | 70 | 1024, {}, |
| r20132 | r20133 | |
|---|---|---|
| 106 | 106 | } |
| 107 | 107 | } |
| 108 | 108 | |
| 109 | ||
| 109 | floppy_image_format_t::desc_e* upd765_format::get_desc_fm(const format &f, int ¤t_size, int &end_gap_index) | |
| 110 | 110 | { |
| 111 | int type = find_size(io, form_factor); | |
| 112 | if(type == -1) | |
| 113 | return false; | |
| 111 | static floppy_image_format_t::desc_e desc[29] = { | |
| 112 | /* 00 */ { FM, 0xff, f.gap_4a }, | |
| 113 | /* 01 */ { FM, 0x00, 6 }, | |
| 114 | /* 02 */ { RAW, 0xf77a, 1 }, | |
| 115 | /* 03 */ { FM, 0xff, f.gap_1 }, | |
| 116 | /* 04 */ { SECTOR_LOOP_START, 0, f.sector_count-1 }, | |
| 117 | /* 05 */ { FM, 0x00, 12 }, | |
| 118 | /* 06 */ { CRC_CCITT_FM_START, 1 }, | |
| 119 | /* 07 */ { RAW, 0xf57e, 1 }, | |
| 120 | /* 08 */ { TRACK_ID_FM }, | |
| 121 | /* 09 */ { HEAD_ID_FM }, | |
| 122 | /* 10 */ { SECTOR_ID_FM }, | |
| 123 | /* 11 */ { SIZE_ID_FM }, | |
| 124 | /* 12 */ { CRC_END, 1 }, | |
| 125 | /* 13 */ { CRC, 1 }, | |
| 126 | /* 14 */ { FM, 0xff, f.gap_2 }, | |
| 127 | /* 15 */ { FM, 0x00, 6 }, | |
| 128 | /* 16 */ { CRC_CCITT_FM_START, 2 }, | |
| 129 | /* 17 */ { RAW, 0xf56f, 1 }, | |
| 130 | /* 18 */ { SECTOR_DATA_FM, -1 }, | |
| 131 | /* 19 */ { CRC_END, 2 }, | |
| 132 | /* 20 */ { CRC, 2 }, | |
| 133 | /* 21 */ { FM, 0xff, f.gap_3 }, | |
| 134 | /* 22 */ { SECTOR_LOOP_END }, | |
| 135 | /* 23 */ { FM, 0xff, 0 }, | |
| 136 | /* 24 */ { RAWBITS, 0xffff, 0 }, | |
| 137 | /* 25 */ { END } | |
| 138 | }; | |
| 114 | 139 | |
| 115 | const format &f = formats[type]; | |
| 140 | current_size = (f.gap_4a+6+1+f.gap_1)*16; | |
| 141 | if(f.sector_base_size) | |
| 142 | current_size += f.sector_base_size * f.sector_count * 16; | |
| 143 | else { | |
| 144 | for(int j=0; j != f.sector_count; j++) | |
| 145 | current_size += f.per_sector_size[j] * 16; | |
| 146 | } | |
| 147 | current_size += (12+1+4+2+f.gap_2+6+1+2+f.gap_3) * f.sector_count * 16; | |
| 116 | 148 | |
| 117 | floppy_image_format_t::desc_e desc[] = { | |
| 149 | end_gap_index = 23; | |
| 150 | ||
| 151 | return desc; | |
| 152 | } | |
| 153 | ||
| 154 | floppy_image_format_t::desc_e* upd765_format::get_desc_mfm(const format &f, int ¤t_size, int &end_gap_index) | |
| 155 | { | |
| 156 | static floppy_image_format_t::desc_e desc[29] = { | |
| 118 | 157 | /* 00 */ { MFM, 0x4e, f.gap_4a }, |
| 119 | 158 | /* 01 */ { MFM, 0x00, 12 }, |
| 120 | 159 | /* 02 */ { RAW, 0x5224, 3 }, |
| r20132 | r20133 | |
| 146 | 185 | /* 28 */ { END } |
| 147 | 186 | }; |
| 148 | 187 | |
| 149 | | |
| 188 | current_size = (f.gap_4a+12+3+1+f.gap_1)*16; | |
| 150 | 189 | if(f.sector_base_size) |
| 151 | 190 | current_size += f.sector_base_size * f.sector_count * 16; |
| 152 | 191 | else { |
| r20132 | r20133 | |
| 155 | 194 | } |
| 156 | 195 | current_size += (12+3+1+4+2+f.gap_2+12+3+1+2+f.gap_3) * f.sector_count * 16; |
| 157 | 196 | |
| 197 | end_gap_index = 26; | |
| 198 | ||
| 199 | return desc; | |
| 200 | } | |
| 201 | ||
| 202 | bool upd765_format::load(io_generic *io, UINT32 form_factor, floppy_image *image) | |
| 203 | { | |
| 204 | int type = find_size(io, form_factor); | |
| 205 | if(type == -1) | |
| 206 | return false; | |
| 207 | ||
| 208 | const format &f = formats[type]; | |
| 209 | floppy_image_format_t::desc_e *desc; | |
| 210 | int current_size; | |
| 211 | int end_gap_index; | |
| 212 | ||
| 213 | switch (f.encoding) | |
| 214 | { | |
| 215 | case floppy_image::FM: | |
| 216 | desc = get_desc_fm(f, current_size, end_gap_index); | |
| 217 | break; | |
| 218 | case floppy_image::MFM: | |
| 219 | default: | |
| 220 | desc = get_desc_mfm(f, current_size, end_gap_index); | |
| 221 | break; | |
| 222 | } | |
| 223 | ||
| 158 | 224 | int total_size = 200000000/f.cell_size; |
| 159 | 225 | int remaining_size = total_size - current_size; |
| 160 | 226 | if(remaining_size < 0) |
| 161 | 227 | throw emu_fatalerror("upd765_format: Incorrect track layout, max_size=%d, current_size=%d", total_size, current_size); |
| 162 | 228 | |
| 163 | 229 | // Fixup the end gap |
| 164 | desc[26].p2 = remaining_size / 16; | |
| 165 | desc[27].p2 = remaining_size & 15; | |
| 166 | desc[27].p1 >>= 16-(remaining_size & 15); | |
| 230 | desc[end_gap_index].p2 = remaining_size / 16; | |
| 231 | desc[end_gap_index + 1].p2 = remaining_size & 15; | |
| 232 | desc[end_gap_index + 1].p1 >>= 16-(remaining_size & 15); | |
| 167 | 233 | |
| 168 | 234 | int track_size = compute_track_size(f); |
| 169 | 235 | |
| r20132 | r20133 | |
| 312 | 378 | |
| 313 | 379 | // Extract the sectors |
| 314 | 380 | generate_bitstream_from_track(0, 0, formats[candidates[0]].cell_size, bitstream, track_size, image); |
| 315 | extract_sectors_from_bitstream_mfm_pc(bitstream, track_size, sectors, sectdata, sizeof(sectdata)); | |
| 316 | 381 | |
| 382 | switch (formats[candidates[0]].encoding) | |
| 383 | { | |
| 384 | case floppy_image::FM: | |
| 385 | extract_sectors_from_bitstream_fm_pc(bitstream, track_size, sectors, sectdata, sizeof(sectdata)); | |
| 386 | break; | |
| 387 | case floppy_image::MFM: | |
| 388 | extract_sectors_from_bitstream_mfm_pc(bitstream, track_size, sectors, sectdata, sizeof(sectdata)); | |
| 389 | break; | |
| 390 | } | |
| 391 | ||
| 317 | 392 | // Check compatibility with every candidate, copy in-place |
| 318 | 393 | int *ok_cands = candidates; |
| 319 | 394 | for(int i=0; i != candidates_count; i++) { |
| r20132 | r20133 | |
| 357 | 432 | |
| 358 | 433 | // Extract the sectors |
| 359 | 434 | generate_bitstream_from_track(track, head, f.cell_size, bitstream, track_size, image); |
| 360 | extract_sectors_from_bitstream_mfm_pc(bitstream, track_size, sectors, sectdata, sizeof(sectdata)); | |
| 361 | 435 | |
| 436 | switch (f.encoding) | |
| 437 | { | |
| 438 | case floppy_image::FM: | |
| 439 | extract_sectors_from_bitstream_fm_pc(bitstream, track_size, sectors, sectdata, sizeof(sectdata)); | |
| 440 | break; | |
| 441 | case floppy_image::MFM: | |
| 442 | extract_sectors_from_bitstream_mfm_pc(bitstream, track_size, sectors, sectdata, sizeof(sectdata)); | |
| 443 | break; | |
| 444 | } | |
| 445 | ||
| 362 | 446 | for(int i=0; i<f.sector_count; i++) { |
| 363 | 447 | desc_s &ds = sdesc[i]; |
| 364 | 448 | desc_xs &xs = sectors[ds.sector_id]; |
| r20132 | r20133 | |
|---|---|---|
| 17 | 17 | struct format { |
| 18 | 18 | UINT32 form_factor; // See floppy_image for possible values |
| 19 | 19 | UINT32 variant; // See floppy_image for possible values |
| 20 | UINT32 encoding; // See floppy_image for possible values | |
| 20 | 21 | |
| 21 | 22 | int cell_size; // See floppy_image_format_t for details |
| 22 | 23 | int sector_count; |
| r20132 | r20133 | |
| 42 | 43 | |
| 43 | 44 | private: |
| 44 | 45 | const format *formats; |
| 46 | floppy_image_format_t::desc_e* get_desc_fm(const format &f, int ¤t_size, int &end_gap_index); | |
| 47 | floppy_image_format_t::desc_e* get_desc_mfm(const format &f, int ¤t_size, int &end_gap_index); | |
| 45 | 48 | int find_size(io_generic *io, UINT32 form_factor); |
| 46 | 49 | int compute_track_size(const format &f) const; |
| 47 | 50 | void build_sector_description(const format &d, UINT8 *sectdata, desc_s *sectors) const; |
| r20132 | r20133 | |
|---|---|---|
| 65 | 65 | // 640-800K on HD which handles 1.2M, really? |
| 66 | 66 | const kc85_format::format kc85_format::formats[] = { |
| 67 | 67 | { |
| 68 | floppy_image::FF_525, floppy_image::DSHD, | |
| 68 | floppy_image::FF_525, floppy_image::DSHD, floppy_image::MFM, | |
| 69 | 69 | 1200, // 1us, 360rpm |
| 70 | 70 | 5, 80, 2, |
| 71 | 71 | 1024, {}, |
| r20132 | r20133 | |
| 73 | 73 | 80, 50, 22, 80 |
| 74 | 74 | }, |
| 75 | 75 | { |
| 76 | floppy_image::FF_525, floppy_image::DSHD, | |
| 76 | floppy_image::FF_525, floppy_image::DSHD, floppy_image::MFM, | |
| 77 | 77 | 1200, // 1us, 360rpm |
| 78 | 78 | 9, 80, 2, |
| 79 | 79 | 512, {}, |
| r20132 | r20133 | |
| 81 | 81 | 80, 50, 22, 80 |
| 82 | 82 | }, |
| 83 | 83 | { |
| 84 | floppy_image::FF_525, floppy_image::DSHD, | |
| 84 | floppy_image::FF_525, floppy_image::DSHD, floppy_image::MFM, | |
| 85 | 85 | 1200, // 1us, 360rpm |
| 86 | 86 | 16, 80, 2, |
| 87 | 87 | 256, {}, |
| r20132 | r20133 | |
|---|---|---|
| 64 | 64 | // Unverified gap sizes |
| 65 | 65 | const apollo_format::format apollo_format::formats[] = { |
| 66 | 66 | { |
| 67 | floppy_image::FF_525, floppy_image::DSHD, | |
| 67 | floppy_image::FF_525, floppy_image::DSHD, floppy_image::MFM, | |
| 68 | 68 | 1200, // 1us, 360rpm |
| 69 | 69 | 8, 77, 2, |
| 70 | 70 | 1024, {}, |
| r20132 | r20133 | |
|---|---|---|
| 63 | 63 | |
| 64 | 64 | const bw2_format::format bw2_format::formats[] = { |
| 65 | 65 | { // 340K 3 1/2 inch double density |
| 66 | floppy_image::FF_35, floppy_image::SSDD, | |
| 66 | floppy_image::FF_35, floppy_image::SSDD, floppy_image::MFM, | |
| 67 | 67 | 2000, 17, 80, 1, 256, {}, 0, {}, 80, 20, 22, 14 |
| 68 | 68 | }, |
| 69 | 69 | { // 360K 3 1/2 inch double density |
| 70 | floppy_image::FF_35, floppy_image::SSDD, | |
| 70 | floppy_image::FF_35, floppy_image::SSDD, floppy_image::MFM, | |
| 71 | 71 | 2000, 18, 80, 1, 256, {}, 0, {}, 80, 20, 22, 14 |
| 72 | 72 | }, |
| 73 | 73 | {} |
| r20132 | r20133 | |
|---|---|---|
| 65 | 65 | // 720K on HD which handles 1.2M, really? |
| 66 | 66 | const pyldin_format::format pyldin_format::formats[] = { |
| 67 | 67 | { |
| 68 | floppy_image::FF_525, floppy_image::DSHD, | |
| 68 | floppy_image::FF_525, floppy_image::DSHD, floppy_image::MFM, | |
| 69 | 69 | 1200, // 1us, 360rpm |
| 70 | 70 | 9, 80, 2, |
| 71 | 71 | 512, {}, |
| r20132 | r20133 | |
|---|---|---|
| 64 | 64 | // Unverified gap sizes |
| 65 | 65 | const m5_format::format m5_format::formats[] = { |
| 66 | 66 | { |
| 67 | floppy_image::FF_525, floppy_image::DSDD, | |
| 67 | floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM, | |
| 68 | 68 | 2000, // 2us, 300rpm |
| 69 | 69 | 18, 40, 2, |
| 70 | 70 | 256, {}, |
| r20132 | r20133 | |
|---|---|---|
| 64 | 64 | // Unverified gap sizes |
| 65 | 65 | const a5105_format::format a5105_format::formats[] = { |
| 66 | 66 | { |
| 67 | floppy_image::FF_525, floppy_image::DSQD, | |
| 67 | floppy_image::FF_525, floppy_image::DSQD, floppy_image::MFM, | |
| 68 | 68 | 2000, // 2us, 300rpm |
| 69 | 69 | 5, 80, 2, |
| 70 | 70 | 1024, {}, |
| r20132 | r20133 | |
|---|---|---|
| 64 | 64 | // Unverified gap sizes |
| 65 | 65 | const bw12_format::format bw12_format::formats[] = { |
| 66 | 66 | { // 180KB BW 12 |
| 67 | floppy_image::FF_525, floppy_image::SSDD, | |
| 67 | floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM, | |
| 68 | 68 | 2000, // 2us, 300rpm |
| 69 | 69 | 18, 40, 1, |
| 70 | 70 | 256, {}, |
| r20132 | r20133 | |
| 72 | 72 | 80, 50, 22, 80 |
| 73 | 73 | }, |
| 74 | 74 | { // 360KB BW 12 |
| 75 | floppy_image::FF_525, floppy_image::DSDD, | |
| 75 | floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM, | |
| 76 | 76 | 2000, // 2us, 300rpm |
| 77 | 77 | 18, 40, 2, |
| 78 | 78 | 256, {}, |
| r20132 | r20133 | |
| 80 | 80 | 80, 50, 22, 80 |
| 81 | 81 | }, |
| 82 | 82 | { // SVI-328 |
| 83 | floppy_image::FF_525, floppy_image::SSDD, | |
| 83 | floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM, | |
| 84 | 84 | 2000, // 2us, 300rpm |
| 85 | 85 | 17, 40, 1, |
| 86 | 86 | 256, {}, |
| r20132 | r20133 | |
| 88 | 88 | 80, 50, 22, 80 |
| 89 | 89 | }, |
| 90 | 90 | { // SVI-328 |
| 91 | floppy_image::FF_525, floppy_image::DSDD, | |
| 91 | floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM, | |
| 92 | 92 | 2000, // 2us, 300rpm |
| 93 | 93 | 17, 40, 2, |
| 94 | 94 | 256, {}, |
| r20132 | r20133 | |
| 96 | 96 | 80, 50, 22, 80 |
| 97 | 97 | }, |
| 98 | 98 | { // Kaypro II |
| 99 | floppy_image::FF_525, floppy_image::SSDD, | |
| 99 | floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM, | |
| 100 | 100 | 2000, // 2us, 300rpm |
| 101 | 101 | 10, 40, 1, |
| 102 | 102 | 512, {}, |
| r20132 | r20133 | |
|---|---|---|
| 64 | 64 | // Unverified gap sizes. May be FM. |
| 65 | 65 | const iq151_format::format iq151_format::formats[] = { |
| 66 | 66 | { |
| 67 | floppy_image::FF_8, floppy_image::SSSD, | |
| 67 | floppy_image::FF_8, floppy_image::SSSD, floppy_image::MFM, | |
| 68 | 68 | 2000, // maybe |
| 69 | 69 | 26, 77, 1, |
| 70 | 70 | 128, {}, |
| r20132 | r20133 | |
|---|---|---|
| 83 | 83 | // Unverified gap sizes |
| 84 | 84 | const mm1_format::format mm1_format::formats[] = { |
| 85 | 85 | { |
| 86 | floppy_image::FF_525, floppy_image::DSQD, | |
| 86 | floppy_image::FF_525, floppy_image::DSQD, floppy_image::MFM, | |
| 87 | 87 | 2000, // 2us, 300rpm |
| 88 | 88 | 8, 80, 2, |
| 89 | 89 | 512, {}, |
| r20132 | r20133 | |
| 96 | 96 | // Unverified gap sizes |
| 97 | 97 | const mm2_format::format mm2_format::formats[] = { |
| 98 | 98 | { |
| 99 | floppy_image::FF_525, floppy_image::DSDD, | |
| 99 | floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM, | |
| 100 | 100 | 2000, // 2us, 300rpm |
| 101 | 101 | 9, 40, 2, |
| 102 | 102 | 512, {}, |
| r20132 | r20133 | |
| 106 | 106 | // 40 tracks but 18 sectors implying HD density at 300rpm, i.e. on |
| 107 | 107 | // 3.5" media? That makes no sense |
| 108 | 108 | { |
| 109 | floppy_image::FF_525, floppy_image::DSHD, | |
| 109 | floppy_image::FF_525, floppy_image::DSHD, floppy_image::MFM, | |
| 110 | 110 | 1000, // 1us, 300rpm, otherwise it just won't fit |
| 111 | 111 | 18, 40, 2, // That line is just nonsense |
| 112 | 112 | 512, {}, |
| r20132 | r20133 | |
|---|---|---|
| 158 | 158 | |
| 159 | 159 | const pc_format::format pc_format::formats[] = { |
| 160 | 160 | { /* 160K 5 1/4 inch double density single sided */ |
| 161 | floppy_image::FF_525, floppy_image::SSDD, | |
| 161 | floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM, | |
| 162 | 162 | 2000, 8, 40, 1, 512, {}, 1, {}, 80, 50, 22, 80 |
| 163 | 163 | }, |
| 164 | 164 | { /* 320K 5 1/4 inch double density */ |
| 165 | floppy_image::FF_525, floppy_image::DSDD, | |
| 165 | floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM, | |
| 166 | 166 | 2000, 8, 40, 2, 512, {}, 1, {}, 80, 50, 22, 80 |
| 167 | 167 | }, |
| 168 | 168 | { /* 180K 5 1/4 inch double density single sided */ |
| 169 | floppy_image::FF_525, floppy_image::SSDD, | |
| 169 | floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM, | |
| 170 | 170 | 2000, 9, 40, 1, 512, {}, 1, {}, 80, 50, 22, 80 |
| 171 | 171 | }, |
| 172 | 172 | { /* 360K 5 1/4 inch double density */ |
| 173 | floppy_image::FF_525, floppy_image::DSDD, | |
| 173 | floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM, | |
| 174 | 174 | 2000, 9, 40, 2, 512, {}, 1, {}, 80, 50, 22, 80 |
| 175 | 175 | }, |
| 176 | 176 | { /* 400K 5 1/4 inch double density - gaps unverified */ |
| 177 | floppy_image::FF_525, floppy_image::DSDD, | |
| 177 | floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM, | |
| 178 | 178 | 2000, 10, 40, 2, 512, {}, 1, {}, 80, 50, 22, 80 |
| 179 | 179 | }, |
| 180 | 180 | { /* 720K 5 1/4 inch quad density - gaps unverified */ |
| 181 | floppy_image::FF_525, floppy_image::DSQD, | |
| 181 | floppy_image::FF_525, floppy_image::DSQD, floppy_image::MFM, | |
| 182 | 182 | 2000, 9, 80, 2, 512, {}, 1, {}, 80, 50, 22, 80 |
| 183 | 183 | }, |
| 184 | 184 | { /* 1200K 5 1/4 inch high density */ |
| 185 | floppy_image::FF_525, floppy_image::DSHD, | |
| 185 | floppy_image::FF_525, floppy_image::DSHD, floppy_image::MFM, | |
| 186 | 186 | 1200, 15, 40, 2, 512, {}, 1, {}, 80, 50, 22, 84 |
| 187 | 187 | }, |
| 188 | 188 | { /* 720K 3 1/2 inch double density */ |
| 189 | floppy_image::FF_35, floppy_image::DSDD, | |
| 189 | floppy_image::FF_35, floppy_image::DSDD, floppy_image::MFM, | |
| 190 | 190 | 2000, 9, 80, 2, 512, {}, 1, {}, 80, 50, 22, 80 |
| 191 | 191 | }, |
| 192 | 192 | { /* 1200K 3 1/2 inch high density (japanese variant) - gaps unverified */ |
| 193 | floppy_image::FF_35, floppy_image::DSHD, | |
| 193 | floppy_image::FF_35, floppy_image::DSHD, floppy_image::MFM, | |
| 194 | 194 | 1200, 15, 40, 2, 512, {}, 1, {}, 80, 50, 22, 84 |
| 195 | 195 | }, |
| 196 | 196 | { /* 1440K 3 1/2 inch high density */ |
| 197 | floppy_image::FF_35, floppy_image::DSHD, | |
| 197 | floppy_image::FF_35, floppy_image::DSHD, floppy_image::MFM, | |
| 198 | 198 | 1000, 18, 80, 2, 512, {}, 1, {}, 80, 50, 22, 108 |
| 199 | 199 | }, |
| 200 | 200 | { /* 2880K 3 1/2 inch extended density - gaps unverified */ |
| 201 | floppy_image::FF_35, floppy_image::DSED, | |
| 201 | floppy_image::FF_35, floppy_image::DSED, floppy_image::MFM, | |
| 202 | 202 | 500, 36, 80, 2, 512, {}, 1, {}, 80, 50, 41, 80 |
| 203 | 203 | }, |
| 204 | 204 | {} |
| r20132 | r20133 | |
|---|---|---|
| 65 | 65 | // 800K on HD which handles 1.2M, really? |
| 66 | 66 | const nanos_format::format nanos_format::formats[] = { |
| 67 | 67 | { |
| 68 | floppy_image::FF_525, floppy_image::DSHD, | |
| 68 | floppy_image::FF_525, floppy_image::DSHD, floppy_image::MFM, | |
| 69 | 69 | 1200, // 1us, 360rpm |
| 70 | 70 | 5, 80, 2, |
| 71 | 71 | 1024, {}, |
| r20132 | r20133 | |
|---|---|---|
| 64 | 64 | const sf7000_format::format sf7000_format::formats[] = { |
| 65 | 65 | { |
| 66 | 66 | // mfm h=00 n=01 sc=10 gpl=2a d=ff |
| 67 | floppy_image::FF_3, floppy_image::SSDD, | |
| 67 | floppy_image::FF_3, floppy_image::SSDD, floppy_image::MFM, | |
| 68 | 68 | 2000, // 2us, 300rpm |
| 69 | 69 | 16, 40, 1, |
| 70 | 70 | 256, {}, |
| r20132 | r20133 | |
|---|---|---|
| 149 | 149 | // find memory regions |
| 150 | 150 | m_rom = memregion("c000")->base(); |
| 151 | 151 | |
| 152 | // initialize floppy controller | |
| 153 | m_fdc->dden_w(1); | |
| 154 | ||
| 155 | 152 | // state saving |
| 156 | 153 | save_item(NAME(m_ds)); |
| 157 | 154 | save_item(NAME(m_q)); |
| r20132 | r20133 | |
| 166 | 163 | |
| 167 | 164 | void comx_fd_device::device_reset() |
| 168 | 165 | { |
| 169 | m_fdc->set_floppy(NULL); | |
| 170 | 166 | m_fdc->reset(); |
| 167 | m_fdc->dden_w(1); | |
| 168 | m_fdc->set_floppy(NULL); | |
| 171 | 169 | |
| 172 | 170 | m_addr = 0; |
| 173 | 171 | m_disb = 1; |
| r20132 | r20133 | |
| 214 | 212 | data = m_rom[offset & 0x1fff]; |
| 215 | 213 | *extrom = 0; |
| 216 | 214 | } |
| 217 | if (offset >= 0xc000 && offset < 0xe000) | |
| 215 | else if (offset >= 0xc000 && offset < 0xe000) | |
| 218 | 216 | { |
| 219 | 217 | data = m_rom[offset & 0x1fff]; |
| 220 | 218 | } |
| r20132 | r20133 | |
| 236 | 234 | if (m_q) |
| 237 | 235 | { |
| 238 | 236 | data = 0xfe | (m_fdc->intrq_r() ? 1 : 0); |
| 239 | //logerror("%s FDC intrq read %02x\n", machine().describe_context(), data); | |
| 240 | 237 | } |
| 241 | 238 | else |
| 242 | 239 | { |
| 243 | 240 | data = m_fdc->gen_r(m_addr); |
| 244 | logerror("%s FDC read %u:%02x\n", machine().describe_context(), m_addr,data); | |
| 241 | if (m_addr==3) logerror("%s FDC read %u:%02x\n", machine().describe_context(), m_addr,data); | |
| 245 | 242 | } |
| 246 | 243 | } |
| 247 | 244 |
| r20132 | r20133 | |
|---|---|---|
| 74 | 74 | |
| 75 | 75 | DECLARE_READ8_MEMBER( ls259_r ); |
| 76 | 76 | DECLARE_WRITE8_MEMBER( ls259_w ); |
| 77 | void fdc_intrq_w(bool state); | |
| 78 | 77 | DECLARE_READ8_MEMBER( pia_pa_r ); |
| 79 | 78 | DECLARE_READ_LINE_MEMBER( pia_cb1_r ); |
| 80 | 79 | DECLARE_WRITE_LINE_MEMBER( pia_cb2_w ); |
| r20132 | r20133 | |
| 100 | 99 | int m_key_shift; |
| 101 | 100 | |
| 102 | 101 | /* floppy state */ |
| 103 | int m_fdc_int; | |
| 104 | 102 | int m_motor_on; |
| 105 | 103 | int m_motor0; |
| 106 | 104 | int m_motor1; |
| r20132 | r20133 | |
|---|---|---|
| 29 | 29 | |
| 30 | 30 | TODO: |
| 31 | 31 | |
| 32 | ||
| 32 | - floppy is broken | |
| 33 | 33 | - floppy motor off timer |
| 34 | 34 | |
| 35 | 35 | */ |
| r20132 | r20133 | |
| 95 | 95 | |
| 96 | 96 | */ |
| 97 | 97 | |
| 98 | m_floppy_timer->adjust(attotime::zero); | |
| 98 | //m_floppy_timer->adjust(attotime::zero); | |
| 99 | floppy_motor_off(); | |
| 99 | 100 | } |
| 100 | 101 | } |
| 101 | 102 | |
| r20132 | r20133 | |
| 384 | 385 | m_char_rom = memregion("chargen")->base(); |
| 385 | 386 | } |
| 386 | 387 | |
| 387 | /* UPD765 Interface */ | |
| 388 | ||
| 389 | void bw12_state::fdc_intrq_w(bool state) | |
| 390 | { | |
| 391 | m_fdc_int = state; | |
| 392 | } | |
| 393 | ||
| 394 | 388 | /* PIA6821 Interface */ |
| 395 | 389 | |
| 396 | 390 | READ8_MEMBER( bw12_state::pia_pa_r ) |
| r20132 | r20133 | |
| 419 | 413 | data |= (m_pit_out2 << 4); |
| 420 | 414 | data |= (m_key_stb << 5); |
| 421 | 415 | data |= (m_key_sin << 6); |
| 422 | data |= (m_fdc_i | |
| 416 | data |= (m_fdc->get_irq() ? 1 : 0) << 7; | |
| 423 | 417 | |
| 424 | 418 | return data; |
| 425 | 419 | } |
| r20132 | r20133 | |
| 595 | 589 | save_item(NAME(m_key_sin)); |
| 596 | 590 | save_item(NAME(m_key_stb)); |
| 597 | 591 | save_item(NAME(m_key_shift)); |
| 598 | save_item(NAME(m_fdc_int)); | |
| 599 | 592 | save_item(NAME(m_motor_on)); |
| 600 | 593 | save_item(NAME(m_motor0)); |
| 601 | 594 | save_item(NAME(m_motor1)); |
| r20132 | r20133 | |
| 719 | 712 | /* System Drivers */ |
| 720 | 713 | |
| 721 | 714 | /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */ |
| 722 | COMP( 1984, bw12, 0, 0, bw12, bw12, driver_device, 0, "Bondwell Holding", "Bondwell 12", GAME_SUPPORTS_SAVE ) | |
| 723 | COMP( 1984, bw14, bw12, 0, bw14, bw12, driver_device, 0, "Bondwell Holding", "Bondwell 14", GAME_SUPPORTS_SAVE ) | |
| 715 | COMP( 1984, bw12, 0, 0, bw12, bw12, driver_device, 0, "Bondwell Holding", "Bondwell 12", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) | |
| 716 | COMP( 1984, bw14, bw12, 0, bw14, bw12, driver_device, 0, "Bondwell Holding", "Bondwell 14", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) |
| r20132 | r20133 | |
|---|---|---|
| 649 | 649 | MCFG_MSM6255_ADD(MSM6255_TAG, XTAL_16MHz, 0, SCREEN_TAG, lcdc_map) |
| 650 | 650 | MCFG_CENTRONICS_PRINTER_ADD(CENTRONICS_TAG, standard_centronics) |
| 651 | 651 | MCFG_I8251_ADD(I8251_TAG, default_i8251_interface) |
| 652 | MCFG_WD2797x_ADD(WD2797_TAG, XTAL_16MHz/ | |
| 652 | MCFG_WD2797x_ADD(WD2797_TAG, XTAL_16MHz/16) | |
| 653 | 653 | MCFG_FLOPPY_DRIVE_ADD(WD2797_TAG":0", bw2_floppies, "35dd", NULL, bw2_state::floppy_formats) |
| 654 | 654 | MCFG_FLOPPY_DRIVE_ADD(WD2797_TAG":1", bw2_floppies, NULL, NULL, bw2_state::floppy_formats) |
| 655 | 655 | MCFG_BW2_EXPANSION_SLOT_ADD(BW2_EXPANSION_SLOT_TAG, XTAL_16MHz, bw2_expansion_cards, NULL, NULL) |
| Previous | 199869 Revisions | Next |