| Previous | 199869 Revisions | Next |
| r33708 Saturday 6th December, 2014 at 11:36:07 UTC by Curt Coder |
|---|
| (MESS) victor9k: Floppy WIP. (nw) |
| [src/mess/machine] | victor9k_fdc.c victor9k_fdc.h |
| r242219 | r242220 | |
|---|---|---|
| 53 | 53 | #define M6522_5_TAG "1k" |
| 54 | 54 | #define M6522_6_TAG "1h" |
| 55 | 55 | |
| 56 | // this is exactly the same decode as used in the Commodore 4040/8050 series drives | |
| 56 | 57 | #define GCR_DECODE(_e, _i) \ |
| 57 | 58 | ((BIT(_e, 6) << 7) | (BIT(_i, 7) << 6) | (_e & 0x33) | (BIT(_e, 2) << 3) | (_i & 0x04)) |
| 58 | 59 | |
| 60 | // Tandon TM-100 spindle @ 300RPM, measured TACH 12VAC 256Hz | |
| 61 | // TACH = RPM / 60 * SPINDLE RATIO * MOTOR POLES | |
| 62 | // 256 = 300 / 60 * 6.4 * 8 | |
| 63 | #define SPINDLE_RATIO 6.4 | |
| 64 | #define MOTOR_POLES 8 | |
| 59 | 65 | |
| 66 | // TODO wrong values here! motor speed is controlled by an LM2917, with help from the spindle TACH and a DAC0808 whose value is set by the SCP 8048 | |
| 67 | const int victor_9000_fdc_t::rpm[] = { 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 254, 255, 257, 259, 260, 262, 264, 266, 267, 269, 271, 273, 275, 276, 278, 280, 282, 284, 286, 288, 290, 291, 293, 295, 297, 299, 301, 303, 305, 307, 309, 311, 313, 315, 318, 320, 322, 324, 326, 328, 330, 333, 335, 337, 339, 342, 344, 346, 348, 351, 353, 355, 358, 360, 362, 365, 367, 370, 372, 375, 377, 380, 382, 385, 387, 390, 392, 395, 398, 400, 403, 406, 408, 411, 414, 416, 419, 422, 425, 428, 430, 433, 436, 439, 442, 445, 448, 451, 454, 457, 460, 463, 466, 469, 472, 475, 478, 482, 485, 488, 491, 494, 498, 501, 504, 508, 511, 514, 518, 521, 525, 528, 532, 535, 539, 542, 546, 550, 553, 557, 561, 564, 568, 572, 576, 579, 583, 587, 591, 595, 599, 603, 607, 611, 615, 619, 623, 627, 631, 636, 640, 644, 648, 653, 657, 661, 666, 670, 674, 679, 683, 688, 693, 697, 702, 706, 711, 716, 721, 725, 730, 735, 740, 745, 750, 755, 760, 765, 770, 775, 780, 785, 790, 796, 801, 806, 812, 817, 822, 828, 833, 839, 844, 850, 856, 861, 867, 873, 878, 884 }; | |
| 68 | ||
| 69 | ||
| 70 | ||
| 60 | 71 | //************************************************************************** |
| 61 | 72 | // DEVICE DEFINITIONS |
| 62 | 73 | //************************************************************************** |
| r242219 | r242220 | |
| 92 | 103 | //------------------------------------------------- |
| 93 | 104 | |
| 94 | 105 | static ADDRESS_MAP_START( floppy_io, AS_IO, 8, victor_9000_fdc_t ) |
| 95 | AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READ(floppy_p1_r | |
| 106 | AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READWRITE(floppy_p1_r, floppy_p1_w) | |
| 96 | 107 | AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_READWRITE(floppy_p2_r, floppy_p2_w) |
| 97 | 108 | AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T0) AM_READ(tach0_r) |
| 98 | 109 | AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(tach1_r) |
| r242219 | r242220 | |
| 106 | 117 | |
| 107 | 118 | int victor_9000_fdc_t::load0_cb(floppy_image_device *device) |
| 108 | 119 | { |
| 120 | // DOOR OPEN 0 | |
| 109 | 121 | m_via4->write_ca1(0); |
| 110 | 122 | |
| 111 | 123 | return IMAGE_INIT_PASS; |
| r242219 | r242220 | |
| 113 | 125 | |
| 114 | 126 | void victor_9000_fdc_t::unload0_cb(floppy_image_device *device) |
| 115 | 127 | { |
| 128 | // DOOR OPEN 0 | |
| 116 | 129 | m_via4->write_ca1(1); |
| 117 | 130 | } |
| 118 | 131 | |
| 119 | 132 | int victor_9000_fdc_t::load1_cb(floppy_image_device *device) |
| 120 | 133 | { |
| 134 | // DOOR OPEN 1 | |
| 121 | 135 | m_via4->write_cb1(0); |
| 122 | 136 | |
| 123 | 137 | return IMAGE_INIT_PASS; |
| r242219 | r242220 | |
| 125 | 139 | |
| 126 | 140 | void victor_9000_fdc_t::unload1_cb(floppy_image_device *device) |
| 127 | 141 | { |
| 142 | // DOOR OPEN 1 | |
| 128 | 143 | m_via4->write_cb1(1); |
| 129 | 144 | } |
| 130 | 145 | |
| r242219 | r242220 | |
| 147 | 162 | MCFG_CPU_IO_MAP(floppy_io) |
| 148 | 163 | |
| 149 | 164 | MCFG_DEVICE_ADD(M6522_4_TAG, VIA6522, XTAL_30MHz/30) |
| 165 | MCFG_VIA6522_READPA_HANDLER(READ8(victor_9000_fdc_t, via4_pa_r)) | |
| 150 | 166 | MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(victor_9000_fdc_t, via4_pa_w)) |
| 167 | MCFG_VIA6522_READPB_HANDLER(READ8(victor_9000_fdc_t, via4_pb_r)) | |
| 151 | 168 | MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(victor_9000_fdc_t, via4_pb_w)) |
| 152 | 169 | MCFG_VIA6522_CA2_HANDLER(WRITELINE(victor_9000_fdc_t, wrsync_w)) |
| 153 | 170 | MCFG_VIA6522_IRQ_HANDLER(WRITELINE(victor_9000_fdc_t, via4_irq_w)) |
| r242219 | r242220 | |
| 319 | 336 | break; |
| 320 | 337 | |
| 321 | 338 | case TM_TACH0: |
| 322 | // TODO | |
| 339 | m_tach0 = !m_tach0; | |
| 340 | if (LOG_SCP) logerror("TACH0 %u\n", m_tach0); | |
| 323 | 341 | break; |
| 324 | 342 | |
| 325 | 343 | case TM_TACH1: |
| 326 | // TODO | |
| 344 | m_tach1 = !m_tach1; | |
| 345 | if (LOG_SCP) logerror("TACH1 %u\n", m_tach1); | |
| 327 | 346 | break; |
| 328 | 347 | } |
| 329 | 348 | } |
| r242219 | r242220 | |
| 355 | 374 | |
| 356 | 375 | |
| 357 | 376 | //------------------------------------------------- |
| 377 | // floppy_p1_w - | |
| 378 | //------------------------------------------------- | |
| 379 | ||
| 380 | WRITE8_MEMBER( victor_9000_fdc_t::floppy_p1_w ) | |
| 381 | { | |
| 382 | /* | |
| 383 | ||
| 384 | bit description | |
| 385 | ||
| 386 | 0 L0MS0 | |
| 387 | 1 L0MS1 | |
| 388 | 2 L0MS2 | |
| 389 | 3 L0MS3 | |
| 390 | 4 L1MS0 | |
| 391 | 5 L1MS1 | |
| 392 | 6 L1MS2 | |
| 393 | 7 L1MS3 | |
| 394 | ||
| 395 | */ | |
| 396 | ||
| 397 | m_l0ms = data & 0x0f; | |
| 398 | m_l1ms = data >> 4; | |
| 399 | } | |
| 400 | ||
| 401 | ||
| 402 | //------------------------------------------------- | |
| 358 | 403 | // floppy_p2_r - |
| 359 | 404 | //------------------------------------------------- |
| 360 | 405 | |
| 361 | 406 | READ8_MEMBER( victor_9000_fdc_t::floppy_p2_r ) |
| 362 | 407 | { |
| 363 | return m_p2; // TODO needed because of ORL/ANL P2, should be in mcs48.c | |
| 408 | /* | |
| 409 | ||
| 410 | bit description | |
| 411 | ||
| 412 | 0 | |
| 413 | 1 | |
| 414 | 2 | |
| 415 | 3 | |
| 416 | 4 | |
| 417 | 5 | |
| 418 | 6 RDY0 | |
| 419 | 7 RDY1 | |
| 420 | ||
| 421 | */ | |
| 422 | ||
| 423 | UINT8 data = m_p2 & 0x3f; | |
| 424 | ||
| 425 | data |= m_rdy0 << 6; | |
| 426 | data |= m_rdy1 << 7; | |
| 427 | ||
| 428 | return data; | |
| 364 | 429 | } |
| 365 | 430 | |
| 366 | 431 | |
| r242219 | r242220 | |
| 407 | 472 | int sel1 = BIT(data, 4); |
| 408 | 473 | if (m_sel1 != sel1) sync = true; |
| 409 | 474 | |
| 410 | //m_rdy0 = BIT(data, 6); | |
| 411 | //m_via5->write_ca2(m_rdy0); | |
| 475 | set_rdy0(BIT(data, 6)); | |
| 476 | set_rdy1(BIT(data, 7)); | |
| 412 | 477 | |
| 413 | //m_rdy1 = BIT(data, 7); | |
| 414 | //m_via5->write_cb2(m_rdy1); | |
| 415 | ||
| 416 | 478 | if (LOG_SCP) logerror("%s %s START0/STOP0/SEL0/RDY0 %u/%u/%u/%u START1/STOP1/SEL1/RDY1 %u/%u/%u/%u\n", machine().time().as_string(), machine().describe_context(), start0, stop0, sel0, m_rdy0, start1, stop1, sel1, m_rdy1); |
| 417 | 479 | |
| 418 | 480 | if (sync) |
| r242219 | r242220 | |
| 500 | 562 | } else if (stop && !floppy->mon_r()) { |
| 501 | 563 | if (LOG_SCP) logerror("%s: motor stop\n", floppy->tag()); |
| 502 | 564 | floppy->mon_w(1); |
| 565 | t_tach->reset(); | |
| 503 | 566 | } |
| 504 | 567 | |
| 505 | 568 | if (sel) { |
| 506 | 569 | da = m_da; |
| 570 | if (!floppy->mon_r()) { | |
| 571 | float tach = rpm[da] / 60 * SPINDLE_RATIO * MOTOR_POLES; | |
| 572 | ||
| 573 | if (LOG_SCP) logerror("%s: motor speed %u rpm / tach %0.1f hz (DA %02x)\n", floppy->tag(), rpm[da], tach, da); | |
| 574 | ||
| 575 | t_tach->adjust(attotime::from_hz(tach*2), 0, attotime::from_hz(tach*2)); | |
| 576 | floppy->set_rpm(rpm[da]); | |
| 577 | } | |
| 507 | 578 | } |
| 508 | 579 | } |
| 509 | 580 | |
| 581 | void victor_9000_fdc_t::set_rdy0(int state) | |
| 582 | { | |
| 583 | //m_rdy0 = state; | |
| 584 | //m_via5->write_ca2(m_rdy0); | |
| 585 | } | |
| 510 | 586 | |
| 587 | void victor_9000_fdc_t::set_rdy1(int state) | |
| 588 | { | |
| 589 | //m_rdy1 = state; | |
| 590 | //m_via5->write_cb2(m_rdy1); | |
| 591 | } | |
| 592 | ||
| 593 | ||
| 511 | 594 | //------------------------------------------------- |
| 512 | 595 | // da_w - |
| 513 | 596 | //------------------------------------------------- |
| r242219 | r242220 | |
| 527 | 610 | } |
| 528 | 611 | } |
| 529 | 612 | |
| 613 | READ8_MEMBER( victor_9000_fdc_t::via4_pa_r ) | |
| 614 | { | |
| 615 | /* | |
| 616 | ||
| 617 | bit description | |
| 618 | ||
| 619 | PA0 L0MS0 | |
| 620 | PA1 L0MS1 | |
| 621 | PA2 L0MS2 | |
| 622 | PA3 L0MS3 | |
| 623 | PA4 | |
| 624 | PA5 | |
| 625 | PA6 | |
| 626 | PA7 | |
| 627 | ||
| 628 | */ | |
| 629 | ||
| 630 | return m_l0ms; | |
| 631 | } | |
| 632 | ||
| 530 | 633 | WRITE8_MEMBER( victor_9000_fdc_t::via4_pa_w ) |
| 531 | 634 | { |
| 532 | 635 | /* |
| r242219 | r242220 | |
| 567 | 670 | } |
| 568 | 671 | } |
| 569 | 672 | |
| 673 | READ8_MEMBER( victor_9000_fdc_t::via4_pb_r ) | |
| 674 | { | |
| 675 | /* | |
| 676 | ||
| 677 | bit description | |
| 678 | ||
| 679 | PB0 L1MS0 | |
| 680 | PB1 L1MS1 | |
| 681 | PB2 L1MS2 | |
| 682 | PB3 L1MS3 | |
| 683 | PB4 | |
| 684 | PB5 | |
| 685 | PB6 | |
| 686 | PB7 | |
| 687 | ||
| 688 | */ | |
| 689 | ||
| 690 | return m_l1ms; | |
| 691 | } | |
| 692 | ||
| 570 | 693 | WRITE8_MEMBER( victor_9000_fdc_t::via4_pb_w ) |
| 571 | 694 | { |
| 572 | 695 | /* |
| r242219 | r242220 | |
| 615 | 738 | m_wrsync = state; |
| 616 | 739 | cur_live.wrsync = state; |
| 617 | 740 | checkpoint(); |
| 618 | if (LOG_VIA) logerror("%s %s | |
| 741 | if (LOG_VIA) logerror("%s %s WRSYNC %u\n", machine().time().as_string(), machine().describe_context(), state); | |
| 619 | 742 | live_run(); |
| 620 | 743 | } |
| 621 | 744 | } |
| r242219 | r242220 | |
| 813 | 936 | |
| 814 | 937 | bit description |
| 815 | 938 | |
| 816 | PB0 | |
| 817 | PB1 | |
| 939 | PB0 RDY0 | |
| 940 | PB1 RDY1 | |
| 818 | 941 | PB2 _SCRESET |
| 819 | 942 | PB3 |
| 820 | 943 | PB4 |
| r242219 | r242220 | |
| 824 | 947 | |
| 825 | 948 | */ |
| 826 | 949 | |
| 950 | set_rdy0(BIT(data, 0)); | |
| 951 | set_rdy1(BIT(data, 1)); | |
| 952 | ||
| 827 | 953 | // motor speed controller reset |
| 828 | 954 | if (!BIT(data, 2)) |
| 829 | 955 | m_maincpu->reset(); |
| r242219 | r242220 | |
|---|---|---|
| 63 | 63 | DECLARE_FLOPPY_FORMATS( floppy_formats ); |
| 64 | 64 | |
| 65 | 65 | DECLARE_READ8_MEMBER( floppy_p1_r ); |
| 66 | DECLARE_WRITE8_MEMBER( floppy_p1_w ); | |
| 66 | 67 | DECLARE_READ8_MEMBER( floppy_p2_r ); |
| 67 | 68 | DECLARE_WRITE8_MEMBER( floppy_p2_w ); |
| 68 | 69 | DECLARE_READ8_MEMBER( tach0_r ); |
| 69 | 70 | DECLARE_READ8_MEMBER( tach1_r ); |
| 70 | 71 | DECLARE_WRITE8_MEMBER( da_w ); |
| 71 | 72 | |
| 73 | DECLARE_READ8_MEMBER( via4_pa_r ); | |
| 72 | 74 | DECLARE_WRITE8_MEMBER( via4_pa_w ); |
| 75 | DECLARE_READ8_MEMBER( via4_pb_r ); | |
| 73 | 76 | DECLARE_WRITE8_MEMBER( via4_pb_w ); |
| 74 | 77 | DECLARE_WRITE_LINE_MEMBER( wrsync_w ); |
| 75 | 78 | DECLARE_WRITE_LINE_MEMBER( via4_irq_w ); |
| r242219 | r242220 | |
| 97 | 100 | virtual machine_config_constructor device_mconfig_additions() const; |
| 98 | 101 | |
| 99 | 102 | private: |
| 103 | static const int rpm[0x100]; | |
| 104 | ||
| 100 | 105 | enum |
| 101 | 106 | { |
| 102 | 107 | TM_GEN, |
| r242219 | r242220 | |
| 167 | 172 | |
| 168 | 173 | void update_stepper_motor(floppy_image_device *floppy, int stp, int old_st, int st); |
| 169 | 174 | void update_spindle_motor(floppy_image_device *floppy, emu_timer *t_tach, bool start, bool stop, bool sel, UINT8 &da); |
| 175 | void set_rdy0(int state); | |
| 176 | void set_rdy1(int state); | |
| 170 | 177 | |
| 171 | 178 | int load0_cb(floppy_image_device *device); |
| 172 | 179 | void unload0_cb(floppy_image_device *device); |
| https://github.com/mamedev/mame/commit/78255c2c595e945d5bfe5b181f0dec96e977ed25 |
| Previous | 199869 Revisions | Next |