branches/alto2/src/emu/machine/diablo_hd.c
| r26160 | r26161 | |
| 63 | 63 | diablo_hd_device::diablo_hd_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : |
| 64 | 64 | device_t(mconfig, DIABLO_HD, "Diablo Disk", tag, owner, clock, "diablo_hd", __FILE__), |
| 65 | 65 | #if DIABLO_DEBUG |
| 66 | | m_log_level(9), |
| 66 | m_log_level(6), |
| 67 | 67 | #endif |
| 68 | 68 | m_diablo31(true), |
| 69 | 69 | m_unit(0), |
| r26160 | r26161 | |
| 273 | 273 | { |
| 274 | 274 | /* If there's no drive, just reset the page number */ |
| 275 | 275 | if (!m_image) { |
| 276 | LOG_DRIVE((0,"[DHD] %s: unit #%d C/H/S:%d/%d/%d => no image\n", __FUNCTION__, m_unit, m_cylinder, m_head, m_sector)); |
| 276 | 277 | m_page = -1; |
| 277 | 278 | return; |
| 278 | 279 | } |
| 279 | 280 | if (m_cylinder < 0 || m_cylinder >= DIABLO_CYLINDERS) { |
| 280 | | LOG_DRIVE((9," DRIVE C/H/S:%d/%d/%d => invalid cylinder\n", m_cylinder, m_head, m_sector)); |
| 281 | LOG_DRIVE((0,"[DHD] %s: unit #%d C/H/S:%d/%d/%d => invalid cylinder\n", __FUNCTION__, m_unit, m_cylinder, m_head, m_sector)); |
| 281 | 282 | m_page = -1; |
| 282 | 283 | return; |
| 283 | 284 | } |
| 284 | 285 | if (m_head < 0 || m_head >= DIABLO_HEADS) { |
| 285 | | LOG_DRIVE((9," DRIVE C/H/S:%d/%d/%d => invalid head\n", m_cylinder, m_head, m_sector)); |
| 286 | LOG_DRIVE((0,"[DHD] %s: unit #%d C/H/S:%d/%d/%d => invalid head\n", __FUNCTION__, m_unit, m_cylinder, m_head, m_sector)); |
| 286 | 287 | m_page = -1; |
| 287 | 288 | return; |
| 288 | 289 | } |
| 289 | 290 | if (m_sector < 0 || m_sector >= DIABLO_SPT) { |
| 290 | | LOG_DRIVE((9," DRIVE C/H/S:%d/%d/%d => invalid sector\n", m_cylinder, m_head, m_sector)); |
| 291 | LOG_DRIVE((0,"[DHD] %s: unit #%d C/H/S:%d/%d/%d => invalid sector\n", __FUNCTION__, m_unit, m_cylinder, m_head, m_sector)); |
| 291 | 292 | m_page = -1; |
| 292 | 293 | return; |
| 293 | 294 | } |
| 294 | 295 | /* calculate the new disk relative sector offset */ |
| 295 | 296 | m_page = DRIVE_PAGE(m_cylinder, m_head, m_sector); |
| 296 | | LOG_DRIVE((9," DRIVE C/H/S:%d/%d/%d => page:%d\n", m_cylinder, m_head, m_sector, m_page)); |
| 297 | 297 | |
| 298 | 298 | // already have the sector image? |
| 299 | | if (m_cache[m_page]) |
| 299 | if (m_cache[m_page]) { |
| 300 | LOG_DRIVE((6,"[DHD] %s: unit #%d C/H/S:%d/%d/%d => page:%d is cached\n", __FUNCTION__, m_unit, m_cylinder, m_head, m_sector, m_page)); |
| 300 | 301 | return; |
| 302 | } |
| 301 | 303 | |
| 302 | 304 | /* allocate a buffer for this page */ |
| 303 | 305 | m_cache[m_page] = global_alloc_array(UINT8, sizeof(diablo_sector_t)); |
| 304 | 306 | /* and read the page from the hard_disk image */ |
| 305 | | if (!hard_disk_read(m_disk, m_page, m_cache[m_page])) { |
| 306 | | LOG_DRIVE((0," read failed for #%d page #%d\n", m_unit, m_page)); |
| 307 | if (hard_disk_read(m_disk, m_page, m_cache[m_page])) { |
| 308 | LOG_DRIVE((2,"[DHD] %s: unit #%d C/H/S:%d/%d/%d => page:%d loaded\n", __FUNCTION__, m_unit, m_cylinder, m_head, m_sector, m_page)); |
| 309 | } else { |
| 310 | LOG_DRIVE((0,"[DHD] %s: unit #%d C/H/S:%d/%d/%d => page:%d read failed\n", __FUNCTION__, m_unit, m_cylinder, m_head, m_sector, m_page)); |
| 307 | 311 | global_free(m_cache[m_page]); |
| 308 | 312 | m_cache[m_page] = 0; |
| 309 | | return; |
| 310 | 313 | } |
| 311 | 314 | } |
| 312 | 315 | |
| r26160 | r26161 | |
| 422 | 425 | |
| 423 | 426 | /* allocate a sector buffer */ |
| 424 | 427 | if (!m_cache[m_page]) { |
| 425 | | LOG_DRIVE((0," no image for #%d page #%d\n", m_unit, m_page)); |
| 428 | LOG_DRIVE((0,"[DHD] %s: no image for #%d page #%d\n", __FUNCTION__, m_unit, m_page)); |
| 426 | 429 | return NULL; |
| 427 | 430 | } |
| 428 | 431 | diablo_sector_t *s = reinterpret_cast<diablo_sector_t *>(m_cache[m_page]); |
| r26160 | r26161 | |
| 469 | 472 | } |
| 470 | 473 | m_bits[m_page] = bits; |
| 471 | 474 | |
| 472 | | LOG_DRIVE((0," BITS #%d: %03d/%d/%02d #%-5d bits (@%03d.%02d)\n", |
| 473 | | m_unit, m_cylinder, m_head, m_sector, |
| 474 | | dst, dst / 32, dst % 32)); |
| 475 | LOG_DRIVE((0,"[DHD] %s: BITS #%d: %03d/%d/%02d #%-5d bits (@%03d.%02d)\n", |
| 476 | __FUNCTION__, m_unit, m_cylinder, m_head, m_sector, dst, dst / 32, dst % 32)); |
| 475 | 477 | |
| 476 | 478 | return bits; |
| 477 | 479 | } |
| r26160 | r26161 | |
| 554 | 556 | } |
| 555 | 557 | } |
| 556 | 558 | /* return if no sync found within size*32 clock and data bits */ |
| 557 | | LOG_DRIVE((0," no sync within %d words\n", size)); |
| 559 | LOG_DRIVE((0,"[DHD] %s: no sync within %d words\n", __FUNCTION__, size)); |
| 558 | 560 | return src; |
| 559 | 561 | } |
| 560 | 562 | |
| r26160 | r26161 | |
| 589 | 591 | } |
| 590 | 592 | } |
| 591 | 593 | /* return if no sync found within size*32 clock and data bits */ |
| 592 | | LOG_DRIVE((0," no unsync within %d words\n", size)); |
| 594 | LOG_DRIVE((0,"[DHD] %s: no unsync within %d words\n", __FUNCTION__, size)); |
| 593 | 595 | return src; |
| 594 | 596 | } |
| 595 | 597 | |
| r26160 | r26161 | |
| 662 | 664 | int cksum_header, cksum_label, cksum_data; |
| 663 | 665 | |
| 664 | 666 | if (m_rdfirst >= 0) { |
| 665 | | LOG_DRIVE((0, |
| 666 | | " RD #%d %03d/%d/%02d bit#%-5d (@%03d.%02d) ... bit#%-5d (@%03d.%02d)\n", |
| 667 | | m_unit, m_cylinder, m_head, m_sector, |
| 667 | LOG_DRIVE((0, "[DHD] %s: RD #%d %03d/%d/%02d bit#%-5d (@%03d.%02d) ... bit#%-5d (@%03d.%02d)\n", |
| 668 | __FUNCTION__, m_unit, m_cylinder, m_head, m_sector, |
| 668 | 669 | m_rdfirst, m_rdfirst / 32, m_rdfirst % 32, |
| 669 | 670 | m_rdlast, m_rdlast / 32, m_rdlast % 32)); |
| 670 | 671 | } |
| r26160 | r26161 | |
| 686 | 687 | } |
| 687 | 688 | |
| 688 | 689 | if (m_wrfirst >= 0) { |
| 689 | | LOG_DRIVE((0, |
| 690 | | " WR #%d %03d/%d/%02d bit#%-5d (@%03d.%02d) ... bit#%-5d (@%03d.%02d)\n", |
| 691 | | m_unit, m_cylinder, m_head, m_sector, |
| 690 | LOG_DRIVE((0, "[DHD] %s: WR #%d %03d/%d/%02d bit#%-5d (@%03d.%02d) ... bit#%-5d (@%03d.%02d)\n", |
| 691 | __FUNCTION__, m_unit, m_cylinder, m_head, m_sector, |
| 692 | 692 | m_wrfirst, m_wrfirst / 32, m_wrfirst % 32, |
| 693 | 693 | m_wrlast, m_wrlast / 32, m_wrlast % 32)); |
| 694 | 694 | } |
| r26160 | r26161 | |
| 696 | 696 | m_wrlast = -1; |
| 697 | 697 | |
| 698 | 698 | if (m_page < 0 || m_page >= DIABLO_PAGES) { |
| 699 | | LOG_DRIVE((0," no sector for #%d: %d/%d/%d\n", m_unit, m_cylinder, m_head, m_sector)); |
| 699 | LOG_DRIVE((0,"[DHD] %s: no sector for #%d: %d/%d/%d\n", __FUNCTION__, m_unit, m_cylinder, m_head, m_sector)); |
| 700 | 700 | return; |
| 701 | 701 | } |
| 702 | 702 | |
| 703 | 703 | if (!m_cache[m_page]) { |
| 704 | | LOG_DRIVE((0," no image for #%d: %d/%d/%d\n", m_unit, m_cylinder, m_head, m_sector)); |
| 704 | LOG_DRIVE((0,"[DHD] %s: no image for #%d: %d/%d/%d\n", __FUNCTION__, m_unit, m_cylinder, m_head, m_sector)); |
| 705 | 705 | return; |
| 706 | 706 | } |
| 707 | 707 | |
| 708 | 708 | /* no bits to write? */ |
| 709 | 709 | if (!m_bits[m_page]) { |
| 710 | | LOG_DRIVE((0," no bits for #%d: %d/%d/%d\n", m_unit, m_cylinder, m_head, m_sector)); |
| 710 | LOG_DRIVE((0,"[DHD] %s: no bits for #%d: %d/%d/%d\n", __FUNCTION__, m_unit, m_cylinder, m_head, m_sector)); |
| 711 | 711 | return; |
| 712 | 712 | } |
| 713 | 713 | UINT32 *bits = m_bits[m_page]; |
| r26160 | r26161 | |
| 723 | 723 | src = squeeze_unsync(bits, src, 40); |
| 724 | 724 | /* sync on header preamble */ |
| 725 | 725 | src = squeeze_sync(bits, src, 40); |
| 726 | | LOG_DRIVE((0," header sync bit #%d (@%03d.%02d)\n", src, src / 32, src % 32)); |
| 726 | LOG_DRIVE((0,"[DHD] %s: header sync bit #%d (@%03d.%02d)\n", __FUNCTION__, src, src / 32, src % 32)); |
| 727 | 727 | src = squeeze_record(bits, src, s->header, sizeof(s->header)); |
| 728 | 728 | src = squeeze_cksum(bits, src, &cksum_header); |
| 729 | 729 | #if DIABLO_DEBUG |
| r26160 | r26161 | |
| 734 | 734 | src = squeeze_unsync(bits, src, 40); |
| 735 | 735 | /* sync on label preamble */ |
| 736 | 736 | src = squeeze_sync(bits, src, 40); |
| 737 | | LOG_DRIVE((0," label sync bit #%d (@%03d.%02d)\n", src, src / 32, src % 32)); |
| 737 | LOG_DRIVE((0,"[DHD] %s: label sync bit #%d (@%03d.%02d)\n", __FUNCTION__, src, src / 32, src % 32)); |
| 738 | 738 | src = squeeze_record(bits, src, s->label, sizeof(s->label)); |
| 739 | 739 | src = squeeze_cksum(bits, src, &cksum_label); |
| 740 | 740 | #if DIABLO_DEBUG |
| r26160 | r26161 | |
| 745 | 745 | src = squeeze_unsync(bits, src, 40); |
| 746 | 746 | /* sync on data preamble */ |
| 747 | 747 | src = squeeze_sync(bits, src, 40); |
| 748 | | LOG_DRIVE((0," data sync bit #%d (@%03d.%02d)\n", src, src / 32, src % 32)); |
| 748 | LOG_DRIVE((0,"[DHD] %s: data sync bit #%d (@%03d.%02d)\n", __FUNCTION__, src, src / 32, src % 32)); |
| 749 | 749 | src = squeeze_record(bits, src, s->data, sizeof(s->data)); |
| 750 | 750 | src = squeeze_cksum(bits, src, &cksum_data); |
| 751 | 751 | #if DIABLO_DEBUG |
| r26160 | r26161 | |
| 759 | 759 | |
| 760 | 760 | if (cksum_header || cksum_label || cksum_data) { |
| 761 | 761 | #if DIABLO_DEBUG |
| 762 | | LOG_DRIVE((0," cksum check - header:%06o label:%06o data:%06o\n", cksum_header, cksum_label, cksum_data)); |
| 763 | | #else |
| 764 | | printf(" cksum check - header:%06o label:%06o data:%06o\n", cksum_header, cksum_label, cksum_data); |
| 762 | LOG_DRIVE((0,"[DHD] %s: cksum check - header:%06o label:%06o data:%06o\n", __FUNCTION__, cksum_header, cksum_label, cksum_data)); |
| 765 | 763 | #endif |
| 766 | 764 | } |
| 767 | 765 | global_free(m_bits[m_page]); |
| 768 | 766 | m_bits[m_page] = 0; |
| 769 | 767 | |
| 770 | 768 | if (!hard_disk_write(m_disk, m_page, m_cache[m_page])) { |
| 771 | | LOG_DRIVE((0," write failed for #%d page #%d\n", m_unit, m_page)); |
| 769 | LOG_DRIVE((0,"[DHD] %s: write failed for #%d page #%d\n", __FUNCTION__, m_unit, m_page)); |
| 772 | 770 | } |
| 773 | 771 | } |
| 774 | 772 | |
| r26160 | r26161 | |
| 964 | 962 | m_addx_acknowledge_0 = 0; |
| 965 | 963 | /* clear log address interlock (?) */ |
| 966 | 964 | m_log_addx_interlock_0 = 1; |
| 967 | | LOG_DRIVE((1," UNIT select %d ready\n", unit)); |
| 965 | LOG_DRIVE((1,"[DHD] %s: UNIT select %d ready\n", __FUNCTION__, unit)); |
| 968 | 966 | } else { |
| 969 | 967 | /* it is not ready (?) */ |
| 970 | 968 | m_ready_0 = 1; |
| r26160 | r26161 | |
| 972 | 970 | m_s_r_w_0 = 1; |
| 973 | 971 | /* address acknowledge (?) */ |
| 974 | 972 | m_addx_acknowledge_0 = 0; |
| 975 | | LOG_DRIVE((1," UNIT select %d not ready (no image)\n", unit)); |
| 973 | LOG_DRIVE((1,"[DHD] %s: UNIT select %d not ready (no image)\n", __FUNCTION__, unit)); |
| 976 | 974 | } |
| 977 | 975 | read_sector(); |
| 978 | 976 | } |
| r26160 | r26161 | |
| 991 | 989 | { |
| 992 | 990 | int seekto = restore ? 0 : cylinder; |
| 993 | 991 | if (strobe) { |
| 994 | | LOG_DRIVE((1," STROBE end of interlock\n", seekto)); |
| 992 | LOG_DRIVE((1,"[DHD] %s: STROBE end of interlock\n", __FUNCTION__, seekto)); |
| 995 | 993 | /* deassert the log address interlock */ |
| 996 | 994 | m_log_addx_interlock_0 = 1; |
| 997 | 995 | return; |
| r26160 | r26161 | |
| 1001 | 999 | m_log_addx_interlock_0 = 0; |
| 1002 | 1000 | |
| 1003 | 1001 | if (seekto == m_cylinder) { |
| 1004 | | LOG_DRIVE((1," STROBE to cylinder %d acknowledge\n", seekto)); |
| 1002 | LOG_DRIVE((1,"[DHD] %s: STROBE to cylinder %d acknowledge\n", __FUNCTION__, seekto)); |
| 1005 | 1003 | m_addx_acknowledge_0 = 0; /* address acknowledge, if cylinder is reached */ |
| 1006 | 1004 | m_seek_incomplete_0 = 1; /* reset seek incomplete */ |
| 1007 | 1005 | return; |
| r26160 | r26161 | |
| 1017 | 1015 | m_log_addx_interlock_0 = 1; /* deassert the log address interlock */ |
| 1018 | 1016 | m_seek_incomplete_0 = 1; /* deassert seek incomplete */ |
| 1019 | 1017 | m_addx_acknowledge_0 = 0; /* assert address acknowledge */ |
| 1020 | | LOG_DRIVE((1," STROBE to cylinder %d incomplete\n", seekto)); |
| 1018 | LOG_DRIVE((1,"[DHD] %s: STROBE to cylinder %d incomplete\n", __FUNCTION__, seekto)); |
| 1021 | 1019 | return; |
| 1022 | 1020 | } |
| 1023 | 1021 | } else { |
| r26160 | r26161 | |
| 1028 | 1026 | m_log_addx_interlock_0 = 1; /* deassert the log address interlock */ |
| 1029 | 1027 | m_seek_incomplete_0 = 1; /* deassert seek incomplete */ |
| 1030 | 1028 | m_addx_acknowledge_0 = 0; /* assert address acknowledge */ |
| 1031 | | LOG_DRIVE((1," STROBE to cylinder %d incomplete\n", seekto)); |
| 1029 | LOG_DRIVE((1,"[DHD] %s: STROBE to cylinder %d incomplete\n", __FUNCTION__, seekto)); |
| 1032 | 1030 | return; |
| 1033 | 1031 | } |
| 1034 | 1032 | } |
| 1035 | | LOG_DRIVE((1," STROBE to cylinder %d (now %d) - interlock\n", seekto, m_cylinder)); |
| 1033 | LOG_DRIVE((1,"[DHD] %s: STROBE to cylinder %d (now %d) - interlock\n", __FUNCTION__, seekto, m_cylinder)); |
| 1036 | 1034 | |
| 1037 | 1035 | m_addx_acknowledge_0 = 1; /* deassert address acknowledge */ |
| 1038 | 1036 | m_seek_incomplete_0 = 1; /* deassert seek incomplete */ |
| r26160 | r26161 | |
| 1103 | 1101 | if (-1 == m_wrfirst) |
| 1104 | 1102 | m_wrfirst = index; |
| 1105 | 1103 | |
| 1106 | | LOG_DRIVE((7," write #%d %d/%d/%d bit #%d bit:%d\n", m_unit, m_cylinder, m_head, m_sector, index, wrdata)); |
| 1104 | LOG_DRIVE((7,"[DHD] %s: write #%d %d/%d/%d bit #%d bit:%d\n", __FUNCTION__, m_unit, m_cylinder, m_head, m_sector, index, wrdata)); |
| 1107 | 1105 | |
| 1108 | 1106 | if (index < GUARD_ZONE_BITS) { |
| 1109 | 1107 | /* don't write in the guard zone (?) */ |
| r26160 | r26161 | |
| 1150 | 1148 | m_rdfirst = index; |
| 1151 | 1149 | |
| 1152 | 1150 | RDBIT(bits,index,bit); |
| 1153 | | LOG_DRIVE((7," read #%d %d/%d/%d bit #%d:%d\n", m_unit, m_cylinder, m_head, m_sector, index, bit)); |
| 1151 | LOG_DRIVE((7,"[DHD] %s: read #%d %d/%d/%d bit #%d:%d\n", __FUNCTION__, m_unit, m_cylinder, m_head, m_sector, index, bit)); |
| 1154 | 1152 | m_rdlast = index; |
| 1155 | 1153 | return bit; |
| 1156 | 1154 | } |
| r26160 | r26161 | |
| 1192 | 1190 | } else { |
| 1193 | 1191 | RDBIT(bits,index,clk); |
| 1194 | 1192 | } |
| 1195 | | LOG_DRIVE((7, " read #%d %d/%d/%d clk #%d:%d\n", m_unit, m_cylinder, m_head, m_sector, index, clk)); |
| 1193 | LOG_DRIVE((7,"[DHD] %s: read #%d %d/%d/%d clk #%d:%d\n", __FUNCTION__, m_unit, m_cylinder, m_head, m_sector, index, clk)); |
| 1196 | 1194 | m_rdlast = index; |
| 1197 | 1195 | return clk ^ 1; |
| 1198 | 1196 | } |
| r26160 | r26161 | |
| 1203 | 1201 | */ |
| 1204 | 1202 | void diablo_hd_device::sector_mark_1() |
| 1205 | 1203 | { |
| 1206 | | LOG_DRIVE((5, " %s (unit #%d C/H/S:%d/%d/%d)\n", __FUNCTION__, m_unit, m_cylinder, m_head, m_sector)); |
| 1204 | LOG_DRIVE((9,"[DHD] %s: unit #%d C/H/S:%d/%d/%d\n", __FUNCTION__, m_unit, m_cylinder, m_head, m_sector)); |
| 1207 | 1205 | /* set sector mark to 1 */ |
| 1208 | 1206 | m_sector_mark_0 = 1; |
| 1209 | 1207 | } |
| r26160 | r26161 | |
| 1218 | 1216 | */ |
| 1219 | 1217 | void diablo_hd_device::sector_mark_0() |
| 1220 | 1218 | { |
| 1221 | | LOG_DRIVE((5," %s (unit #%d C/H/S:%d/%d/%d)\n", __FUNCTION__, m_unit, m_cylinder, m_head, m_sector)); |
| 1219 | LOG_DRIVE((9,"[DHD] %s: unit #%d C/H/S:%d/%d/%d\n", __FUNCTION__, m_unit, m_cylinder, m_head, m_sector)); |
| 1222 | 1220 | |
| 1223 | 1221 | /* squeeze previous sector, if it was written to */ |
| 1224 | 1222 | squeeze_sector(); |
| r26160 | r26161 | |
| 1233 | 1231 | |
| 1234 | 1232 | /* count sectors */ |
| 1235 | 1233 | m_sector = (m_sector + 1) % DIABLO_SPT; |
| 1234 | /* read the sector */ |
| 1236 | 1235 | read_sector(); |
| 1237 | 1236 | } |
| 1238 | 1237 | |
| r26160 | r26161 | |
| 1244 | 1243 | m_packs = 1; // FIXME: get from configuration? |
| 1245 | 1244 | |
| 1246 | 1245 | m_cache = global_alloc_array(UINT8*, DIABLO_PAGES); |
| 1246 | memset(m_cache, 0, sizeof(UINT8*) * DIABLO_PAGES); |
| 1247 | 1247 | m_bits = global_alloc_array(UINT32*, DIABLO_PAGES); |
| 1248 | memset(m_bits, 0, sizeof(UINT32*) * DIABLO_PAGES); |
| 1248 | 1249 | |
| 1249 | 1250 | m_timer = timer_alloc(1, 0); |
| 1250 | 1251 | } |
| r26160 | r26161 | |
| 1253 | 1254 | { |
| 1254 | 1255 | m_handle = m_image->get_chd_file(); |
| 1255 | 1256 | m_disk = m_image->get_hard_disk_file(); |
| 1256 | | LOG_DRIVE((0,"[DIABLO] m_image=%p m_handle=%p m_disk=%p\n", m_image, m_handle, m_disk)); |
| 1257 | LOG_DRIVE((0,"[DHD] %s: m_image=%p m_handle=%p m_disk=%p\n", __FUNCTION__, m_image, m_handle, m_disk)); |
| 1257 | 1258 | |
| 1258 | 1259 | if (m_diablo31) { |
| 1259 | 1260 | snprintf(m_description, sizeof(m_description), "DIABLO31"); |
| r26160 | r26161 | |
| 1270 | 1271 | m_sector_mark_1_time = DIABLO44_SECTOR_MARK_PULSE_PRE; |
| 1271 | 1272 | m_bit_time = DIABLO44_BIT_TIME(1); |
| 1272 | 1273 | } |
| 1273 | | LOG_DRIVE((0,"[DIABLO] rotation time : %.0fns\n", 1e9 * m_rotation_time.as_double())); |
| 1274 | | LOG_DRIVE((0,"[DIABLO] sector time : %.0fns\n", 1e9 * m_sector_time.as_double())); |
| 1275 | | LOG_DRIVE((0,"[DIABLO] sector mark 0 time : %.0fns\n", 1e9 * m_sector_mark_0_time.as_double())); |
| 1276 | | LOG_DRIVE((0,"[DIABLO] sector mark 1 time : %.0fns\n", 1e9 * m_sector_mark_1_time.as_double())); |
| 1277 | | LOG_DRIVE((0,"[DIABLO] bit time : %.0fns\n", 1e9 * m_bit_time.as_double())); |
| 1274 | LOG_DRIVE((0,"[DHD] %s: rotation time : %.0fns\n", __FUNCTION__, 1e9 * m_rotation_time.as_double())); |
| 1275 | LOG_DRIVE((0,"[DHD] %s: sector time : %.0fns\n", __FUNCTION__, 1e9 * m_sector_time.as_double())); |
| 1276 | LOG_DRIVE((0,"[DHD] %s: sector mark 0 time : %.0fns\n", __FUNCTION__, 1e9 * m_sector_mark_0_time.as_double())); |
| 1277 | LOG_DRIVE((0,"[DHD] %s: sector mark 1 time : %.0fns\n", __FUNCTION__, 1e9 * m_sector_mark_1_time.as_double())); |
| 1278 | LOG_DRIVE((0,"[DHD] %s: bit time : %.0fns\n", __FUNCTION__, 1e9 * m_bit_time.as_double())); |
| 1278 | 1279 | |
| 1279 | 1280 | m_s_r_w_0 = 1; /* seek/read/write not ready */ |
| 1280 | 1281 | m_ready_0 = 1; /* drive is not ready */ |
| r26160 | r26161 | |
| 1286 | 1287 | /* reset the disk drive's address */ |
| 1287 | 1288 | m_cylinder = 0; |
| 1288 | 1289 | m_head = 0; |
| 1289 | | m_sector = 0; |
| 1290 | m_sector = DIABLO_SPT - 1; |
| 1290 | 1291 | m_page = -1; |
| 1291 | 1292 | |
| 1292 | 1293 | /* disable the gates */ |
| r26160 | r26161 | |
| 1300 | 1301 | m_rdfirst = -1; |
| 1301 | 1302 | m_rdlast = -1; |
| 1302 | 1303 | |
| 1303 | | timer_set(m_sector_time - m_sector_mark_0_time, 1, 0); |
| 1304 | if (m_handle) |
| 1305 | timer_set(m_sector_time - m_sector_mark_0_time, 1, 0); |
| 1304 | 1306 | } |
| 1305 | 1307 | |
| 1306 | 1308 | /** |
| r26160 | r26161 | |
| 1316 | 1318 | */ |
| 1317 | 1319 | void diablo_hd_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) |
| 1318 | 1320 | { |
| 1319 | | LOG_DRIVE((0,"[DIABLO] id=%d param=%d ptr=%p timer expires in %lldns\n", id, param, ptr)); |
| 1321 | LOG_DRIVE((6,"[DHD] %s: id=%d param=%d ptr=%p\n", __FUNCTION__, id, param, ptr)); |
| 1320 | 1322 | |
| 1321 | 1323 | switch (param) { |
| 1322 | 1324 | case 0: |