Previous 199869 Revisions Next

r19081 Tuesday 20th November, 2012 at 21:44:13 UTC by Angelo Salese
Converted PC-9801 to use the new i8237 DMA core
[src/mess/drivers]apc.c pc9801.c

trunk/src/mess/drivers/pc9801.c
r19080r19081
235235#include "cpu/i386/i386.h"
236236#include "machine/i8255.h"
237237#include "machine/pit8253.h"
238#include "machine/8237dma.h"
238#include "machine/am9517a.h"
239239#include "machine/pic8259.h"
240240#include "machine/upd765.h"
241241#include "machine/upd1990a.h"
r19080r19081
256256public:
257257   pc9801_state(const machine_config &mconfig, device_type type, const char *tag)
258258      : driver_device(mconfig, type, tag),
259        m_maincpu(*this, "maincpu"),
260        m_rtc(*this, UPD1990A_TAG),
261        m_sio(*this, UPD8251_TAG),
262        m_hgdc1(*this, "upd7220_chr"),
263        m_hgdc2(*this, "upd7220_btm"),
259      m_maincpu(*this, "maincpu"),
260      m_dmac(*this, "i8237"),
261      m_rtc(*this, UPD1990A_TAG),
262      m_sio(*this, UPD8251_TAG),
263      m_hgdc1(*this, "upd7220_chr"),
264      m_hgdc2(*this, "upd7220_btm"),
264265      m_video_ram_1(*this, "video_ram_1"),
265266      m_video_ram_2(*this, "video_ram_2"){ }
266267
267268   required_device<cpu_device> m_maincpu;
269   required_device<am9517a_device> m_dmac;
268270   required_device<upd1990a_device> m_rtc;
269271   required_device<i8251_device> m_sio;
270272   required_device<upd7220_device> m_hgdc1;
r19080r19081
278280   UINT8 *m_char_rom;
279281
280282   UINT8 m_portb_tmp;
281   int m_dma_channel;
282   UINT8 m_dma_offset[2][4];
283   UINT8 m_at_pages[0x10];
283   UINT8 m_dma_offset[4];
284   int m_dack;
284285
285286   UINT8 m_vrtc_irq_mask;
286287   UINT8 m_video_ff[8];
r19080r19081
376377   DECLARE_READ8_MEMBER(pc9821_a0_r);
377378   DECLARE_WRITE8_MEMBER(pc9821_a0_w);
378379   DECLARE_READ8_MEMBER(ide_status_r);
379   DECLARE_READ8_MEMBER(pc_dma_read_byte);
380   DECLARE_WRITE8_MEMBER(pc_dma_write_byte);
381380   DECLARE_READ8_MEMBER(pc9801rs_access_ctrl_r);
382381   DECLARE_WRITE8_MEMBER(pc9801rs_access_ctrl_w);
383382
r19080r19081
429428   DECLARE_INPUT_CHANGED_MEMBER(shift_stroke);
430429   DECLARE_WRITE_LINE_MEMBER(pc9801_master_set_int_line);
431430   DECLARE_READ8_MEMBER(get_slave_ack);
432   DECLARE_WRITE_LINE_MEMBER(pc_dma_hrq_changed);
433   DECLARE_WRITE_LINE_MEMBER(pc_dack0_w);
434   DECLARE_WRITE_LINE_MEMBER(pc_dack1_w);
435   DECLARE_WRITE_LINE_MEMBER(pc_dack2_w);
436   DECLARE_WRITE_LINE_MEMBER(pc_dack3_w);
437   DECLARE_READ8_MEMBER(test_r);
438   DECLARE_WRITE8_MEMBER(test_w);
431   DECLARE_WRITE_LINE_MEMBER(pc9801_dma_hrq_changed);
432   DECLARE_WRITE_LINE_MEMBER(pc9801_tc_w);
433   DECLARE_READ8_MEMBER(pc9801_dma_read_byte);
434   DECLARE_WRITE8_MEMBER(pc9801_dma_write_byte);
435   DECLARE_WRITE_LINE_MEMBER(pc9801_dack0_w);
436   DECLARE_WRITE_LINE_MEMBER(pc9801_dack1_w);
437   DECLARE_WRITE_LINE_MEMBER(pc9801_dack2_w);
438   DECLARE_WRITE_LINE_MEMBER(pc9801_dack3_w);
439   DECLARE_READ8_MEMBER(fdc_r);
440   DECLARE_WRITE8_MEMBER(fdc_w);
439441   DECLARE_READ8_MEMBER(ppi_sys_porta_r);
440442   DECLARE_READ8_MEMBER(ppi_sys_portb_r);
441443   DECLARE_READ8_MEMBER(ppi_prn_portb_r);
r19080r19081
648650   }
649651   else // odd
650652   {
651      return i8237_r(machine().device("dma8237"), space, (offset & 0x1e) >> 1);
653      return m_dmac->read(space, (offset & 0x1e) >> 1, 0xff);
652654   }
653655
654656   return 0xff;
r19080r19081
665667   }
666668   else // odd
667669   {
668      i8237_w(machine().device("dma8237"), space, (offset & 0x1e) >> 1, data);
670      m_dmac->write(space, (offset & 0x1e) >> 1, data, 0xff);
669671   }
670672}
671673
r19080r19081
708710   }
709711   else // odd
710712   {
711      printf("Write to DMA bank register %d %02x\n",((offset >> 1)+1) & 3,data);
712      m_dma_offset[0][((offset >> 1)+1) & 3] = data & 0x0f;
713      printf("Write to DMA bank register %d %02x\n",(offset >> 1) & 3,data);
714      m_dma_offset[(offset >> 1) & 3] = data & 0x0f; // TODO: old was +1? Why?
713715   }
714716}
715717
r19080r19081
23032305*
23042306****************************************/
23052307
2306WRITE_LINE_MEMBER(pc9801_state::pc_dma_hrq_changed)
2308WRITE_LINE_MEMBER(pc9801_state::pc9801_dma_hrq_changed)
23072309{
2308   machine().device("maincpu")->execute().set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE);
2310   m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE);
23092311
2310   /* Assert HLDA */
2311   i8237_hlda_w( machine().device("dma8237"), state );
2312   m_dmac->hack_w(state);
2313
2314//  printf("%02x HLDA\n",state);
23122315}
23132316
2317WRITE_LINE_MEMBER(pc9801_state::pc9801_tc_w )
2318{
2319   /* floppy terminal count */
2320//   m_fdc->tc_w(state);
23142321
2315READ8_MEMBER(pc9801_state::pc_dma_read_byte)
2322//   printf("TC %02x\n",state);
2323}
2324
2325READ8_MEMBER(pc9801_state::pc9801_dma_read_byte)
23162326{
2317   offs_t page_offset = (((offs_t) m_dma_offset[0][m_dma_channel]) << 16)
2318      & 0xFF0000;
2327   address_space &program = m_maincpu->space(AS_PROGRAM);
2328   offs_t addr = (m_dma_offset[m_dack] << 16) | offset;
23192329
2320   return space.read_byte(page_offset + offset);
2330//   printf("%08x\n",addr);
2331
2332   return program.read_byte(addr);
23212333}
23222334
23232335
2324WRITE8_MEMBER(pc9801_state::pc_dma_write_byte)
2336WRITE8_MEMBER(pc9801_state::pc9801_dma_write_byte)
23252337{
2326   offs_t page_offset = (((offs_t) m_dma_offset[0][m_dma_channel]) << 16)
2327      & 0xFF0000;
2338   address_space &program = m_maincpu->space(AS_PROGRAM);
2339   offs_t addr = (m_dma_offset[m_dack] << 16) | offset;
23282340
2329   space.write_byte(page_offset + offset, data);
2341//  printf("%08x %02x\n",addr,data);
2342
2343   program.write_byte(addr, data);
23302344}
23312345
23322346static void set_dma_channel(running_machine &machine, int channel, int state)
23332347{
23342348   pc9801_state *drvstate = machine.driver_data<pc9801_state>();
2335   if (!state) drvstate->m_dma_channel = channel;
2349   if (!state) drvstate->m_dack = channel;
23362350}
23372351
2338WRITE_LINE_MEMBER(pc9801_state::pc_dack0_w){ /*printf("%02x 0\n",state);*/ set_dma_channel(machine(), 0, state); }
2339WRITE_LINE_MEMBER(pc9801_state::pc_dack1_w){ /*printf("%02x 1\n",state);*/ set_dma_channel(machine(), 1, state); }
2340WRITE_LINE_MEMBER(pc9801_state::pc_dack2_w){ /*printf("%02x 2\n",state);*/ set_dma_channel(machine(), 2, state); }
2341WRITE_LINE_MEMBER(pc9801_state::pc_dack3_w){ /*printf("%02x 3\n",state);*/ set_dma_channel(machine(), 3, state); }
2352WRITE_LINE_MEMBER(pc9801_state::pc9801_dack0_w){ /*printf("%02x 0\n",state);*/ set_dma_channel(machine(), 0, state); }
2353WRITE_LINE_MEMBER(pc9801_state::pc9801_dack1_w){ /*printf("%02x 1\n",state);*/ set_dma_channel(machine(), 1, state); }
2354WRITE_LINE_MEMBER(pc9801_state::pc9801_dack2_w){ /*printf("%02x 2\n",state);*/ set_dma_channel(machine(), 2, state); }
2355WRITE_LINE_MEMBER(pc9801_state::pc9801_dack3_w){ /*printf("%02x 3\n",state);*/ set_dma_channel(machine(), 3, state); }
23422356
2343READ8_MEMBER(pc9801_state::test_r)
2357/* TODO: double check channel for this one */
2358READ8_MEMBER(pc9801_state::fdc_r)
23442359{
23452360   printf("2dd DACK R\n");
23462361
23472362   return 0xff;
23482363}
23492364
2350WRITE8_MEMBER(pc9801_state::test_w)
2365WRITE8_MEMBER(pc9801_state::fdc_w)
23512366{
23522367   printf("2dd DACK W\n");
23532368}
23542369
2355static I8237_INTERFACE( dma8237_config )
2370static I8237_INTERFACE( dmac_intf )
23562371{
2357   DEVCB_DRIVER_LINE_MEMBER(pc9801_state, pc_dma_hrq_changed),
2358   DEVCB_NULL,
2359   DEVCB_DRIVER_MEMBER(pc9801_state, pc_dma_read_byte),
2360   DEVCB_DRIVER_MEMBER(pc9801_state, pc_dma_write_byte),
2361   { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_DRIVER_MEMBER(pc9801_state,test_r) },
2362   { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_DRIVER_MEMBER(pc9801_state,test_w) },
2363   { DEVCB_DRIVER_LINE_MEMBER(pc9801_state, pc_dack0_w), DEVCB_DRIVER_LINE_MEMBER(pc9801_state, pc_dack1_w), DEVCB_DRIVER_LINE_MEMBER(pc9801_state, pc_dack2_w), DEVCB_DRIVER_LINE_MEMBER(pc9801_state, pc_dack3_w) }
2372   DEVCB_DRIVER_LINE_MEMBER(pc9801_state, pc9801_dma_hrq_changed),
2373   DEVCB_DRIVER_LINE_MEMBER(pc9801_state, pc9801_tc_w),
2374   DEVCB_DRIVER_MEMBER(pc9801_state, pc9801_dma_read_byte),
2375   DEVCB_DRIVER_MEMBER(pc9801_state, pc9801_dma_write_byte),
2376   { DEVCB_NULL, DEVCB_DRIVER_MEMBER(pc9801_state,fdc_r), DEVCB_NULL, DEVCB_NULL },
2377   { DEVCB_NULL, DEVCB_DRIVER_MEMBER(pc9801_state,fdc_w), DEVCB_NULL, DEVCB_NULL },
2378   { DEVCB_DRIVER_LINE_MEMBER(pc9801_state, pc9801_dack0_w), DEVCB_DRIVER_LINE_MEMBER(pc9801_state, pc9801_dack1_w), DEVCB_DRIVER_LINE_MEMBER(pc9801_state, pc9801_dack2_w), DEVCB_DRIVER_LINE_MEMBER(pc9801_state, pc9801_dack3_w) }
23642379};
23652380
23662381/****************************************
r19080r19081
26542669   MCFG_MACHINE_RESET_OVERRIDE(pc9801_state,pc9801f)
26552670
26562671   MCFG_PIT8253_ADD( "pit8253", pit8253_config )
2657   MCFG_I8237_ADD( "dma8237", 5000000, dma8237_config ) //unknown clock
2672   MCFG_I8237_ADD("i8237", 5000000, dmac_intf) // unknown clock
26582673   MCFG_PIC8259_ADD( "pic8259_master", pic8259_master_config )
26592674   MCFG_PIC8259_ADD( "pic8259_slave", pic8259_slave_config )
26602675   MCFG_I8255_ADD( "ppi8255_sys", ppi_system_intf )
r19080r19081
27212736   MCFG_MACHINE_RESET_OVERRIDE(pc9801_state,pc9801rs)
27222737
27232738   MCFG_PIT8253_ADD( "pit8253", pc9801rs_pit8253_config )
2724   MCFG_I8237_ADD( "dma8237", 16000000, dma8237_config ) //unknown clock
2739   MCFG_I8237_ADD("i8237", 16000000, dmac_intf) // unknown clock
27252740   MCFG_PIC8259_ADD( "pic8259_master", pic8259_master_config )
27262741   MCFG_PIC8259_ADD( "pic8259_slave", pic8259_slave_config )
27272742   MCFG_I8255_ADD( "ppi8255_sys", ppi_system_intf )
r19080r19081
27822797   MCFG_MACHINE_RESET_OVERRIDE(pc9801_state,pc9801rs)
27832798
27842799   MCFG_PIT8253_ADD( "pit8253", pc9801rs_pit8253_config )
2785   MCFG_I8237_ADD( "dma8237", 16000000, dma8237_config ) //unknown clock
2800   MCFG_I8237_ADD("i8237", 16000000, dmac_intf) // unknown clock
27862801   MCFG_PIC8259_ADD( "pic8259_master", pic8259_master_config )
27872802   MCFG_PIC8259_ADD( "pic8259_slave", pic8259_slave_config )
27882803   MCFG_I8255_ADD( "ppi8255_sys", ppi_system_intf )
trunk/src/mess/drivers/apc.c
r19080r19081
421421
422422READ8_MEMBER(apc_state::apc_dma_r)
423423{
424   return machine().device<am9517a_device>("i8237")->read(space, BITSWAP8(offset,7,6,5,4,2,1,0,3), 0xff);
424   return m_dmac->read(space, BITSWAP8(offset,7,6,5,4,2,1,0,3), 0xff);
425425}
426426
427427WRITE8_MEMBER(apc_state::apc_dma_w)
428428{
429   machine().device<am9517a_device>("i8237")->write(space, BITSWAP8(offset,7,6,5,4,2,1,0,3), data, 0xff);
429   m_dmac->write(space, BITSWAP8(offset,7,6,5,4,2,1,0,3), data, 0xff);
430430}
431431
432432WRITE8_MEMBER(apc_state::apc_irq_ack_w)

Previous 199869 Revisions Next


© 1997-2024 The MAME Team