Previous 199869 Revisions Next

r19278 Monday 3rd December, 2012 at 15:45:33 UTC by Carl
upd765.c: changes to busy flag, r/w sector increment and reset int [Carl]
(MESS) move pcjr fdc stuff to pc.c as it is unique and restore kb timer (nw)
[src/emu/machine]upd765.c
[src/mess/drivers]pc.c
[src/mess/includes]pc.h
[src/mess/machine]pc.c pc_fdc.c pc_fdc.h

trunk/src/emu/machine/upd765.c
r19277r19278
127127
128128   if(ready_polled) {
129129      poll_timer = timer_alloc(TIMER_DRIVE_READY_POLLING);
130      poll_timer->adjust(attotime::from_usec(1024), 0, attotime::from_usec(1024));
130      poll_timer->adjust(attotime::from_usec(100), 0, attotime::from_usec(1024));
131131   } else
132132      poll_timer = NULL;
133133
r19277r19278
171171
172172   check_irq();
173173   if(ready_polled)
174      poll_timer->adjust(attotime::from_usec(1024), 0, attotime::from_usec(1024));
174      poll_timer->adjust(attotime::from_usec(100), 0, attotime::from_usec(1024));
175175}
176176
177177void upd765_family_device::tc_w(bool _tc)
r19277r19278
295295   for(int i=0; i<4; i++)
296296      if(flopi[i].main_state == RECALIBRATE || flopi[i].main_state == SEEK) {
297297         msr |= 1<<i;
298         msr |= MSR_CB;
298         //msr |= MSR_CB;
299299      }
300300
301301   if(data_irq) {
r19277r19278
14931493         command[4]++;
14941494         if(command[4] > command[6]) {
14951495            command[4] = 1;
1496            command[3] = command[3] ^ 1;
14961497            if(command[0] & 0x80) {
1497               command[3] = command[3] ^ 1;
14981498               if(fi.dev)
14991499                  fi.dev->ss_w(command[3] & 1);
1500            }
1501            if(!(command[0] & 0x80) || !(command[3] & 1)) {
1502               command[2]++;
1503               if(!tc_done) {
1504                  st0 |= ST0_FAIL;
1505                  st1 |= ST1_EN;
1500               if(!command[3]) {
1501                  done = true;
1502                  command[2]++;
15061503               }
1504            } else {
15071505               done = true;
1506               if(!command[3])
1507                  command[2]++;
15081508            }
1509            if(!tc_done && done) {
1510               st0 |= ST0_FAIL;
1511               st1 |= ST1_EN;
1512            }
15091513         }
15101514         if(!done) {
15111515            fi.sub_state = SEEK_DONE;
r19277r19278
16051609         command[4]++;
16061610         if(command[4] > command[6]) {
16071611            command[4] = 1;
1612            command[3] = command[3] ^ 1;
16081613            if(command[0] & 0x80) {
1609               command[3] = command[3] ^ 1;
16101614               if(fi.dev)
16111615                  fi.dev->ss_w(command[3] & 1);
1612            }
1613            if(!(command[0] & 0x80) || !(command[3] & 1)) {
1614               command[2]++;
1615               if(!tc_done) {
1616                  st0 |= ST0_FAIL;
1617                  st1 |= ST1_EN;
1616               if(!command[3]) {
1617                  done = true;
1618                  command[2]++;
16181619               }
1620            } else {
16191621               done = true;
1622               if(!command[3])
1623                  command[2]++;
16201624            }
1625            if(!tc_done && done) {
1626               st0 |= ST0_FAIL;
1627               st1 |= ST1_EN;
1628            }
16211629         }
16221630         if(!done) {
16231631            fi.sub_state = HEAD_LOAD_DONE;
trunk/src/mess/machine/pc_fdc.c
r19277r19278
1616
1717const device_type PC_FDC_XT = &device_creator<pc_fdc_xt_device>;
1818const device_type PC_FDC_AT = &device_creator<pc_fdc_at_device>;
19const device_type PC_FDC_JR = &device_creator<pc_fdc_jr_device>;
2019
2120static MACHINE_CONFIG_FRAGMENT( cfg )
2221   MCFG_UPD765A_ADD("upd765", false, false)
r19277r19278
4241   AM_RANGE(0x7, 0x7) AM_READWRITE(dir_r, ccr_w)
4342ADDRESS_MAP_END
4443
45
46
4744pc_fdc_family_device::pc_fdc_family_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock) : pc_fdc_interface(mconfig, type, name, tag, owner, clock), fdc(*this, "upd765")
4845{
4946}
r19277r19278
199196   m_shortname = "pc_fdc_at";
200197}
201198
202pc_fdc_jr_device::pc_fdc_jr_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : pc_fdc_family_device(mconfig, PC_FDC_JR, "PC FDC JR", tag, owner, clock)
203{
204   m_shortname = "pc_fdc_jr";
205}
206
207199#if 0
208200
209201
trunk/src/mess/machine/pc_fdc.h
r19277r19278
1717#define MCFG_PC_FDC_AT_ADD(_tag) \
1818   MCFG_DEVICE_ADD(_tag, PC_FDC_AT, 0)
1919
20#define MCFG_PC_FDC_JR_ADD(_tag) \
21   MCFG_DEVICE_ADD(_tag, PC_FDC_JR, 0)
22
23
2420class pc_fdc_family_device : public pc_fdc_interface {
2521public:
2622   pc_fdc_family_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock);
r19277r19278
7470   virtual DECLARE_ADDRESS_MAP(map, 8);
7571};
7672
77class pc_fdc_jr_device : public pc_fdc_family_device {
78public:
79   pc_fdc_jr_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
80};
81
82
8373extern const device_type PC_FDC_XT;
8474extern const device_type PC_FDC_AT;
85extern const device_type PC_FDC_JR;
8675
87
8876#if 0
8977/* interface has been seperated, so that it can be used in the super i/o chip */
9078
trunk/src/mess/machine/pc.c
r19277r19278
11711171   pc_set_irq_line( machine, 1, state );
11721172}
11731173
1174TIMER_CALLBACK_MEMBER(pc_state::pcjr_fdc_watchdog)
1175{
1176   if(m_pcjr_dor & 0x20)
1177      fdc_interrupt(1);
1178   else
1179      fdc_interrupt(0);
1180}
1181
1182WRITE8_MEMBER(pc_state::pcjr_fdc_dor_w)
1183{
1184   logerror("fdc: dor = %02x\n", data);
1185   UINT8 pdor = m_pcjr_dor;
1186   upd765a_device *fdc = machine().device<upd765a_device>("upd765");
1187   floppy_image_device *floppy = machine().device<floppy_connector>("upd765:0")->get_device();
1188   m_pcjr_dor = data;
1189
1190   if(floppy)
1191      floppy->mon_w(!(m_pcjr_dor & 1));
1192
1193   if(m_pcjr_dor & 1)
1194      fdc->set_floppy(floppy);
1195   else
1196      fdc->set_floppy(NULL);
1197
1198   if((pdor^m_pcjr_dor) & 0x80)
1199      fdc->reset();
1200   
1201   if(m_pcjr_dor & 0x20) {
1202      if((pdor & 0x40) && !(m_pcjr_dor & 0x40))
1203         m_pcjr_watchdog->adjust(attotime::from_seconds(3));
1204   } else {
1205      m_pcjr_watchdog->adjust(attotime::never);
1206      fdc_interrupt(0);
1207   }
1208}
1209
11741210/*
11751211 * MC1502 uses a FD1793 clone instead of uPD765
11761212 */
r19277r19278
14281464
14291465MACHINE_START_MEMBER(pc_state,pcjr)
14301466{
1431   pc_fdc_interface *fdc = machine().device<pc_fdc_interface>("fdc");
1432   fdc->setup_intrq_cb(pc_fdc_interface::line_cb(FUNC(pc_state::fdc_interrupt), this));
14331467   pc_int_delay_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(pc_state::pcjr_delayed_pic8259_irq),this));
1434   m_maincpu = machine().device<cpu_device>("maincpu" );
1468   m_pcjr_watchdog = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(pc_state::pcjr_fdc_watchdog),this));
1469   pcjr_keyb.keyb_signal_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(pc_state::pcjr_keyb_signal_callback),this));
1470   m_maincpu = machine().device<cpu_device>("maincpu");
14351471   m_maincpu->set_irq_acknowledge_callback(pc_irq_callback);
14361472
1473   machine().device<upd765a_device>("upd765")->set_ready_line_connected(false);
1474   
1475
14371476   m_pic8259 = machine().device("pic8259");
14381477   m_dma8237 = NULL;
14391478   m_pit8253 = machine().device("pit8253");
r19277r19278
14591498   m_ppi_data_signal = 0;
14601499   m_ppi_shift_register = 0;
14611500   m_ppi_shift_enable = 0;
1501   m_pcjr_dor = 0;
14621502   speaker_level_w( speaker, 0 );
14631503
14641504   pcjr_keyb_init(machine());
trunk/src/mess/includes/pc.h
r19277r19278
3939   UINT8 m_dma_offset[2][4];
4040   UINT8 m_pc_spkrdata;
4141   UINT8 m_pc_input;
42   UINT8 m_pcjr_dor;
43   emu_timer *m_pcjr_watchdog;
4244
4345   int                  m_ppi_portc_switch_high;
4446   int                  m_ppi_speaker;
r19277r19278
8789   DECLARE_MACHINE_START(mc1502);
8890   TIMER_CALLBACK_MEMBER(pcjr_delayed_pic8259_irq);
8991   TIMER_CALLBACK_MEMBER(pcjr_keyb_signal_callback);
92   TIMER_CALLBACK_MEMBER(pcjr_fdc_watchdog);
9093   TIMER_CALLBACK_MEMBER(mc1502_keyb_signal_callback);
9194   TIMER_CALLBACK_MEMBER(pc_rtc_timer);
9295   TIMER_DEVICE_CALLBACK_MEMBER(pc_frame_interrupt);
r19277r19278
127130   DECLARE_WRITE8_MEMBER(mc1502_wd17xx_aux_w);
128131   DECLARE_READ8_MEMBER(mc1502_wd17xx_drq_r);
129132   DECLARE_READ8_MEMBER(mc1502_wd17xx_motor_r);
133   DECLARE_WRITE8_MEMBER(pcjr_fdc_dor_w);
130134
131135   void fdc_interrupt(bool state);
132136   void fdc_dma_drq(bool state);
trunk/src/mess/drivers/pc.c
r19277r19278
456456   AM_RANGE(0x0080, 0x0087) AM_READWRITE(pc_page_r,            pc_page_w)
457457   AM_RANGE(0x00a0, 0x00a0) AM_READWRITE(pcjr_nmi_enable_r, pc_nmi_enable_w )
458458   AM_RANGE(0x00c0, 0x00c0) AM_DEVWRITE("sn76496", sn76496_device, write)
459   AM_RANGE(0x00f0, 0x00f7) AM_DEVICE("fdc", pc_fdc_interface, map)
459   AM_RANGE(0x00f2, 0x00f2) AM_WRITE(pcjr_fdc_dor_w)
460   AM_RANGE(0x00f4, 0x00f5) AM_DEVICE("upd765", upd765a_device, map)
460461   AM_RANGE(0x0200, 0x0207) AM_READWRITE_LEGACY(pc_JOY_r,               pc_JOY_w)
461462   AM_RANGE(0x02f8, 0x02ff) AM_DEVREADWRITE("ins8250_1", ins8250_device, ins8250_r, ins8250_w)
462463   AM_RANGE(0x0378, 0x037f) AM_READWRITE_LEGACY(pc_t1t_p37x_r,         pc_t1t_p37x_w)
r19277r19278
12961297   /* cassette */
12971298   MCFG_CASSETTE_ADD( CASSETTE_TAG, ibm5150_cassette_interface )
12981299
1299   MCFG_PC_FDC_JR_ADD("fdc")
1300   MCFG_UPD765A_ADD("upd765", false, false)
13001301
1301   MCFG_FLOPPY_DRIVE_ADD("fdc:0", ibmpc_floppies, "525dd", 0, pc_state::floppy_formats)
1302   MCFG_FLOPPY_DRIVE_ADD("upd765:0", ibmpc_floppies, "525dd", 0, pc_state::floppy_formats)
13021303
13031304   /* cartridge */
13041305   MCFG_CARTSLOT_ADD("cart1")

Previous 199869 Revisions Next


© 1997-2024 The MAME Team