Previous 199869 Revisions Next

r19145 Monday 26th November, 2012 at 01:51:56 UTC by Angelo Salese
De-kludgeized floppy motor functionality
[src/mess/drivers]pc88va.c

trunk/src/mess/drivers/pc88va.c
r19144r19145
6161public:
6262   pc88va_state(const machine_config &mconfig, device_type type, const char *tag)
6363      : driver_device(mconfig, type, tag) ,
64      m_maincpu(*this, "maincpu"),
6465      m_fdc(*this, "upd765"),
6566      m_dmac(*this, "dmac"),
6667      m_palram(*this, "palram"){ }
6768
69   required_device<cpu_device> m_maincpu;
6870   required_device<upd765a_device> m_fdc;
6971   required_device<upd71071_device> m_dmac;
7072   required_shared_ptr<UINT16> m_palram;
r19144r19145
8082   UINT8 m_buf_index;
8183   UINT8 m_buf_ram[16];
8284   UINT8 m_portc_test;
85   UINT8 m_fdc_motor_status[2];
8386
8487   /* floppy state */
8588   UINT8 m_i8255_0_pc;
r19144r19145
100103   DECLARE_WRITE16_MEMBER(backupram_wp_1_w);
101104   DECLARE_WRITE16_MEMBER(backupram_wp_0_w);
102105   DECLARE_READ8_MEMBER(hdd_status_r);
103   DECLARE_WRITE8_MEMBER(upd765_mc_w);
104106   #if TEST_SUBFDC
105107   DECLARE_READ8_MEMBER(upd765_tc_r);
108   DECLARE_WRITE8_MEMBER(upd765_mc_w);
106109   #else
107110   DECLARE_READ8_MEMBER(no_subfdc_r);
108111   #endif
r19144r19145
139142//   DECLARE_WRITE_LINE_MEMBER(pc88va_upd765_interrupt);
140143   UINT8 m_fdc_ctrl_2;
141144   TIMER_CALLBACK_MEMBER(pc88va_fdc_timer);
145   TIMER_CALLBACK_MEMBER(pc88va_fdc_motor_start_0);
146   TIMER_CALLBACK_MEMBER(pc88va_fdc_motor_start_1);
142147//   UINT16 m_fdc_dma_r(running_machine &machine);
143148//   void m_fdc_dma_w(running_machine &machine, UINT16 data);
149   DECLARE_WRITE_LINE_MEMBER(pc88va_hlda_w);
144150   DECLARE_WRITE_LINE_MEMBER(pc88va_tc_w);
145151
146152   void fdc_irq(bool state);
r19144r19145
979985   return 0x20;
980986}
981987
982/* TODO: check this */
983WRITE8_MEMBER(pc88va_state::upd765_mc_w)
984{
985   machine().device<floppy_connector>("upd765:0")->get_device()->mon_w(!(data & 1));
986   machine().device<floppy_connector>("upd765:1")->get_device()->mon_w(!(data & 2));
987}
988
989988READ8_MEMBER(pc88va_state::pc88va_fdc_r)
990989{
991990   printf("%08x\n",offset);
r19144r19145
10121011   }
10131012}
10141013
1014TIMER_CALLBACK_MEMBER(pc88va_state::pc88va_fdc_motor_start_0)
1015{
1016   machine().device<floppy_connector>("upd765:0")->get_device()->mon_w(0);
1017   m_fdc_motor_status[0] = 1;
1018}
1019
1020TIMER_CALLBACK_MEMBER(pc88va_state::pc88va_fdc_motor_start_1)
1021{
1022   machine().device<floppy_connector>("upd765:1")->get_device()->mon_w(0);
1023   m_fdc_motor_status[1] = 1;
1024}
1025
10151026WRITE8_MEMBER(pc88va_state::pc88va_fdc_w)
10161027{
10171028   printf("%08x %02x\n",offset<<1,data);
r19144r19145
10371048         machine().device<floppy_connector>("upd765:1")->get_device()->set_rpm(data & 0x02 ? 360 : 300);
10381049
10391050         machine().device<upd765a_device>("upd765")->set_rate(data & 0x20 ? 500000 : 250000);
1040         /* Temporary hack */
1041         machine().device<floppy_connector>("upd765:0")->get_device()->mon_w(0);
1042         machine().device<floppy_connector>("upd765:1")->get_device()->mon_w(0);
1043
10441051         break;
10451052      /*
10461053        ---- x--- PCM: ?
1047        ---- --xx M1/M0: Drive 1/0 motor control (0) Motor OFF (1) Motor ON
1054        ---- --xx M1/M0: Drive 1/0 motor control (0) NOP (1) Change motor status
10481055        */
1049      case 0x04: upd765_mc_w(space,0,data); break;
1056      case 0x04:
1057         if(data & 1)
1058         {
1059            machine().device<floppy_connector>("upd765:0")->get_device()->mon_w(1);
1060            if(m_fdc_motor_status[0] == 0)
1061               machine().scheduler().timer_set(attotime::from_msec(505), timer_expired_delegate(FUNC(pc88va_state::pc88va_fdc_motor_start_0),this));
1062            else
1063               m_fdc_motor_status[0] = 0;
1064         }
1065
1066         if(data & 2)
1067         {
1068            machine().device<floppy_connector>("upd765:1")->get_device()->mon_w(1);
1069            if(m_fdc_motor_status[1] == 0)
1070               machine().scheduler().timer_set(attotime::from_msec(505), timer_expired_delegate(FUNC(pc88va_state::pc88va_fdc_motor_start_1),this));
1071            else
1072               m_fdc_motor_status[1] = 0;
1073         }
1074
1075         break;
10501076      /*
10511077        x--- ---- FDCRST: FDC Reset
10521078        -xx- ---- FDCFRY FRYCEN: FDC force ready control
r19144r19145
12461272   m_fdc_irq_opcode = data;
12471273}
12481274
1275WRITE8_MEMBER(pc88va_state::upd765_mc_w)
1276{
1277   machine().device<floppy_connector>("upd765:0")->get_device()->mon_w(!(data & 1));
1278   machine().device<floppy_connector>("upd765:1")->get_device()->mon_w(!(data & 2));
1279}
1280
12491281static ADDRESS_MAP_START( pc88va_z80_io_map, AS_IO, 8, pc88va_state )
12501282   ADDRESS_MAP_GLOBAL_MASK(0xff)
12511283   AM_RANGE(0xf0, 0xf0) AM_WRITE(fdc_irq_vector_w) // Interrupt Opcode Port
r19144r19145
16381670   #if TEST_SUBFDC
16391671   machine().device("fdccpu")->execute().set_input_line_vector(0, 0);
16401672   #endif
1673
1674   m_fdc_motor_status[0] = 0;
1675   m_fdc_motor_status[1] = 0;
16411676}
16421677
16431678INTERRUPT_GEN_MEMBER(pc88va_state::pc88va_vrtc_irq)
r19144r19145
17141749   DEVCB_NULL
17151750};
17161751
1752WRITE_LINE_MEMBER(pc88va_state::pc88va_hlda_w)
1753{
1754   m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE);
1755
1756//   m_dmac->hack_w(state);
1757
1758//  printf("%02x HLDA\n",state);
1759}
1760
17171761WRITE_LINE_MEMBER( pc88va_state::pc88va_tc_w )
17181762{
17191763   /* floppy terminal count */
r19144r19145
17431787{
17441788   "maincpu",
17451789   8000000,
1746   DEVCB_NULL,
1790   DEVCB_DRIVER_LINE_MEMBER(pc88va_state, pc88va_hlda_w),
17471791   DEVCB_DRIVER_LINE_MEMBER(pc88va_state, pc88va_tc_w),
17481792   { 0, 0, m_fdc_dma_r, 0 },
17491793   { 0, 0, m_fdc_dma_w, 0 },

Previous 199869 Revisions Next


© 1997-2024 The MAME Team