Previous 199869 Revisions Next

r18988 Friday 16th November, 2012 at 17:13:30 UTC by Angelo Salese
Fixed DMA hook-up, removing the ROM hack. Asserts due of i8237_hlda_w for whatever reason ...
[src/mess/drivers]apc.c

trunk/src/mess/drivers/apc.c
r18987r18988
6868public:
6969   apc_state(const machine_config &mconfig, device_type type, const char *tag)
7070      : driver_device(mconfig, type, tag),
71        m_maincpu(*this, "maincpu"),
72        m_hgdc1(*this, "upd7220_chr"),
73        m_hgdc2(*this, "upd7220_btm"),
74        m_i8259_m(*this, "pic8259_master"),
75        m_i8259_s(*this, "pic8259_slave"),
76        m_video_ram_1(*this, "video_ram_1"),
77        m_video_ram_2(*this, "video_ram_2")
71      m_maincpu(*this, "maincpu"),
72      m_hgdc1(*this, "upd7220_chr"),
73      m_hgdc2(*this, "upd7220_btm"),
74      m_i8259_m(*this, "pic8259_master"),
75      m_i8259_s(*this, "pic8259_slave"),
76      m_fdc(*this, "upd765"),
77      m_dma(*this, "8237dma"),
78      m_video_ram_1(*this, "video_ram_1"),
79      m_video_ram_2(*this, "video_ram_2")
7880   { }
7981
8082   // devices
r18987r18988
8385   required_device<upd7220_device> m_hgdc2;
8486   required_device<pic8259_device> m_i8259_m;
8587   required_device<pic8259_device> m_i8259_s;
88   required_device<upd765a_device> m_fdc;
89   required_device<i8237_device> m_dma;
8690   UINT8 *m_char_rom;
8791
8892   required_shared_ptr<UINT8> m_video_ram_1;
r18987r18988
101105   DECLARE_READ8_MEMBER(apc_kbd_r);
102106   DECLARE_WRITE8_MEMBER(apc_kbd_w);
103107   DECLARE_WRITE8_MEMBER(apc_dma_segments_w);
108   DECLARE_READ8_MEMBER(apc_dma_r);
109   DECLARE_WRITE8_MEMBER(apc_dma_w);
104110
105111   DECLARE_WRITE_LINE_MEMBER(apc_master_set_int_line);
106112   DECLARE_READ8_MEMBER(get_slave_ack);
107   DECLARE_WRITE_LINE_MEMBER(pc_dma_hrq_changed);
108   DECLARE_WRITE_LINE_MEMBER(pc_dack0_w);
109   DECLARE_WRITE_LINE_MEMBER(pc_dack1_w);
110   DECLARE_WRITE_LINE_MEMBER(pc_dack2_w);
111   DECLARE_WRITE_LINE_MEMBER(pc_dack3_w);
113   DECLARE_WRITE_LINE_MEMBER(apc_dma_hrq_changed);
114   DECLARE_WRITE_LINE_MEMBER(apc_tc_w);
115   DECLARE_WRITE_LINE_MEMBER(apc_dack0_w);
116   DECLARE_WRITE_LINE_MEMBER(apc_dack1_w);
117   DECLARE_WRITE_LINE_MEMBER(apc_dack2_w);
118   DECLARE_WRITE_LINE_MEMBER(apc_dack3_w);
112119   DECLARE_READ8_MEMBER(test_r);
113120   DECLARE_WRITE8_MEMBER(test_w);
114   DECLARE_READ8_MEMBER(pc_dma_read_byte);
115   DECLARE_WRITE8_MEMBER(pc_dma_write_byte);
121   DECLARE_READ8_MEMBER(apc_dma_read_byte);
122   DECLARE_WRITE8_MEMBER(apc_dma_write_byte);
116123
124   void fdc_irq(bool state);
125   void fdc_drq(bool state);
126   DECLARE_WRITE_LINE_MEMBER(fdc_irq);
127   DECLARE_WRITE_LINE_MEMBER(fdc_drq);
128
117129   DECLARE_DRIVER_INIT(apc);
118130   DECLARE_PALETTE_INIT(apc);
119131
r18987r18988
330342   m_dma_offset[0][offset & 3] = data & 0x0f;
331343}
332344
345/*
346NEC APC i8237 hook-up looks pretty weird ...
347
348                NEC APC (shift 1) IBM PC
349CH0_ADR ==      0X01     0x00       0x00  ; CH-0 address (RW)
350CH1_ADR ==      0X03     0x01       0x02  ; CH-1 address (RW)
351CH2_ADR ==      0X05     0x02       0x04  ; CH-2 address (RW)
352CH3_ADR ==      0X07     0x03       0x06  ; CH-3 address (RW)
353DMA_ST  ==      0X09     0x04       0x08  ; status register (R)
354DMA_CMD ==      0X09     0x04       0x08  ; command register (W)
355DMA_WSM ==      0X0B     0x05       0x0a  ; write single mask (W)
356DMA_CFF ==      0X0D     0x06       0x0c  ; clear flip flop (W)
357
358CH0_TC  ==      0X11     0x08       0x01  ; CH-0 terminal count (RW)
359CH1_TC  ==      0X13     0x09       0x03  ; CH-1 terminal count (RW)
360CH2_TC  ==      0X15     0x0a       0x05  ; CH-2 terminal count (RW)
361CH3_TC  ==      0X17     0x0b       0x07  ; CH-3 terminal count (RW)
362DMA_WRR ==      0X19     0x0c       0x09  ; write request register (W)
363DMA_MODE==      0X1B     0x0d       0x0b  ; write mode (W)
364DMA_RTR ==      0X1D     0x0e       0x0d? ; read temp register (R)
365DMA_MC  ==      0X1D     0x0e       0x0d  ; master clear (W)
366DMA_WAM ==      0X1F     0x0f       0x0f? ; write all mask (W)
367CH0_EXA ==      0X38                      ; CH-0 extended address (W)
368CH1_EXA ==      0X3A                      ; CH-1 extended address (W)
369CH2_EXA ==      0X3C                      ; CH-2 extended address (W)
370CH3_EXA ==      0X3E                      ; CH-3 extended address (W)
371
372... apparently, they rotated right the offset, compared to normal hook-up.
373*/
374
375READ8_MEMBER(apc_state::apc_dma_r)
376{
377   return i8237_r(m_dma, space, BITSWAP8(offset,7,6,5,4,2,1,0,3));
378}
379
380WRITE8_MEMBER(apc_state::apc_dma_w)
381{
382   i8237_w(m_dma, space, BITSWAP8(offset,7,6,5,4,2,1,0,3), data);
383}
384
385
333386static ADDRESS_MAP_START( apc_map, AS_PROGRAM, 16, apc_state )
334387   AM_RANGE(0x00000, 0x1ffff) AM_RAM
335388//   AM_RANGE(0xa0000, 0xaffff) space for an external ROM
r18987r18988
338391
339392static ADDRESS_MAP_START( apc_io, AS_IO, 16, apc_state )
340393//  ADDRESS_MAP_GLOBAL_MASK(0xff)
341   AM_RANGE(0x00, 0x1f) AM_DEVREADWRITE8_LEGACY("8237dma", i8237_r, i8237_w, 0x00ff)
394   AM_RANGE(0x00, 0x1f) AM_READWRITE8(apc_dma_r, apc_dma_w,0xff00)
342395   AM_RANGE(0x20, 0x23) AM_DEVREADWRITE8_LEGACY("pic8259_master", pic8259_r, pic8259_w, 0x00ff) // i8259
343396   AM_RANGE(0x28, 0x2f) AM_READWRITE8(apc_port_28_r, apc_port_28_w, 0xffff)
344397//   0x30, 0x37 serial port 0/1 (i8251) (even/odd)
r18987r18988
411464   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
412465INPUT_PORTS_END
413466
467void apc_state::fdc_drq(bool state)
468{
469   printf("%02x DRQ\n",state);
470   i8237_dreq0_w(m_dma, state);
471}
414472
473void apc_state::fdc_irq(bool state)
474{
475   printf("IRQ %d\n",state);
476   pic8259_ir3_w(machine().device("pic8259_slave"), state);
477}
478
415479void apc_state::machine_start()
416480{
481   m_fdc->setup_intrq_cb(upd765a_device::line_cb(FUNC(apc_state::fdc_irq), this));
482   m_fdc->setup_drq_cb(upd765a_device::line_cb(FUNC(apc_state::fdc_drq), this));
417483}
418484
419485void apc_state::machine_reset()
r18987r18988
423489
424490void apc_state::palette_init()
425491{
492
426493}
427494
428495static UPD7220_INTERFACE( hgdc_1_intf )
r18987r18988
551618*
552619****************************************/
553620
554WRITE_LINE_MEMBER(apc_state::pc_dma_hrq_changed)
621WRITE_LINE_MEMBER(apc_state::apc_dma_hrq_changed)
555622{
556623   machine().device("maincpu")->execute().set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE);
557624
625   printf("%02x HLDA\n",state);
626
558627   /* Assert HLDA */
559628   i8237_hlda_w( machine().device("dma8237"), state );
560629}
561630
631WRITE_LINE_MEMBER( apc_state::apc_tc_w )
632{
633   /* floppy terminal count */
634//   m_fdc->tc_w(!state);
635   printf("TC %02x\n",state);
636}
562637
563READ8_MEMBER(apc_state::pc_dma_read_byte)
638READ8_MEMBER(apc_state::apc_dma_read_byte)
564639{
565640   offs_t page_offset = (((offs_t) m_dma_offset[0][m_dma_channel]) << 16)
566641      & 0xFF0000;
r18987r18988
569644}
570645
571646
572WRITE8_MEMBER(apc_state::pc_dma_write_byte)
647WRITE8_MEMBER(apc_state::apc_dma_write_byte)
573648{
574649   offs_t page_offset = (((offs_t) m_dma_offset[0][m_dma_channel]) << 16)
575650      & 0xFF0000;
r18987r18988
583658   if (!state) drvstate->m_dma_channel = channel;
584659}
585660
586WRITE_LINE_MEMBER(apc_state::pc_dack0_w){ /*printf("%02x 0\n",state);*/ set_dma_channel(machine(), 0, state); }
587WRITE_LINE_MEMBER(apc_state::pc_dack1_w){ /*printf("%02x 1\n",state);*/ set_dma_channel(machine(), 1, state); }
588WRITE_LINE_MEMBER(apc_state::pc_dack2_w){ /*printf("%02x 2\n",state);*/ set_dma_channel(machine(), 2, state); }
589WRITE_LINE_MEMBER(apc_state::pc_dack3_w){ /*printf("%02x 3\n",state);*/ set_dma_channel(machine(), 3, state); }
661WRITE_LINE_MEMBER(apc_state::apc_dack0_w){ printf("%02x 0\n",state); set_dma_channel(machine(), 0, state); }
662WRITE_LINE_MEMBER(apc_state::apc_dack1_w){ printf("%02x 1\n",state); set_dma_channel(machine(), 1, state); }
663WRITE_LINE_MEMBER(apc_state::apc_dack2_w){ printf("%02x 2\n",state); set_dma_channel(machine(), 2, state); }
664WRITE_LINE_MEMBER(apc_state::apc_dack3_w){ printf("%02x 3\n",state); set_dma_channel(machine(), 3, state); }
590665
591666READ8_MEMBER(apc_state::test_r)
592667{
593//   printf("2dd DACK R\n");
668   printf("2dd DACK R\n");
594669
595670   return 0xff;
596671}
597672
598673WRITE8_MEMBER(apc_state::test_w)
599674{
600//   printf("2dd DACK W\n");
675   printf("2dd DACK W\n");
601676}
602677
603678static I8237_INTERFACE( dma8237_config )
604679{
605   DEVCB_DRIVER_LINE_MEMBER(apc_state, pc_dma_hrq_changed),
606   DEVCB_NULL,
607   DEVCB_DRIVER_MEMBER(apc_state, pc_dma_read_byte),
608   DEVCB_DRIVER_MEMBER(apc_state, pc_dma_write_byte),
609   { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_DRIVER_MEMBER(apc_state,test_r) },
610   { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_DRIVER_MEMBER(apc_state,test_w) },
611   { DEVCB_DRIVER_LINE_MEMBER(apc_state, pc_dack0_w), DEVCB_DRIVER_LINE_MEMBER(apc_state, pc_dack1_w), DEVCB_DRIVER_LINE_MEMBER(apc_state, pc_dack2_w), DEVCB_DRIVER_LINE_MEMBER(apc_state, pc_dack3_w) }
680   DEVCB_DRIVER_LINE_MEMBER(apc_state, apc_dma_hrq_changed),
681   DEVCB_DRIVER_LINE_MEMBER(apc_state, apc_tc_w),
682   DEVCB_DRIVER_MEMBER(apc_state, apc_dma_read_byte),
683   DEVCB_DRIVER_MEMBER(apc_state, apc_dma_write_byte),
684   { DEVCB_NULL, DEVCB_DRIVER_MEMBER(apc_state,test_r), DEVCB_NULL, DEVCB_NULL },
685   { DEVCB_NULL, DEVCB_DRIVER_MEMBER(apc_state,test_w), DEVCB_NULL, DEVCB_NULL },
686   { DEVCB_DRIVER_LINE_MEMBER(apc_state, apc_dack0_w), DEVCB_DRIVER_LINE_MEMBER(apc_state, apc_dack1_w), DEVCB_DRIVER_LINE_MEMBER(apc_state, apc_dack2_w), DEVCB_DRIVER_LINE_MEMBER(apc_state, apc_dack3_w) }
612687};
613688
614689static const floppy_format_type apc_floppy_formats[] = {
r18987r18988
693768
694769DRIVER_INIT_MEMBER(apc_state,apc)
695770{
696   UINT8 *ROM = memregion("ipl")->base();
697
698   /* patch DMA check */
699   ROM[0xff334 & 0x1fff] = 0x90;
700   ROM[0xff335 & 0x1fff] = 0x90;
701   ROM[0xff339 & 0x1fff] = 0x90;
702   ROM[0xff33a & 0x1fff] = 0x90;
703
771   // ...
704772}
705773
706774GAME( 1982, apc,  0,   apc,  apc, apc_state,  apc,       ROT0, "NEC",      "APC", GAME_NOT_WORKING | GAME_NO_SOUND )

Previous 199869 Revisions Next


© 1997-2024 The MAME Team