Previous 199869 Revisions Next

r18995 Friday 16th November, 2012 at 18:41:03 UTC by Angelo Salese
Changed DMA to use the new AM core, and improved floppy loading. It starts to load a bunch of CP/M-86 bytes but then dies at sector 02
[src/mess/drivers]apc.c

trunk/src/mess/drivers/apc.c
r18994r18995
55   preliminary driver by Angelo Salese
66
77   TODO:
8   - Bogus DMA check, patched out for now
98   - video emulation
10   - Floppy device and IMD support
9   - Floppy device
1110   - keyboard
1211   - Understand interrupt sources
1312   - NMI seems valid, dumps a x86 stack to vram?
r18994r18995
4746   0x61 - 0x67 (Mirror of pit8253?)
4847   0x68 - 0x6f parallel port
4948
49----------------------------------------------------------------------------
500xfe3c2: checks if the floppy has a valid string for booting (either "CP/M-86"
51         or "MS-DOS"), if not, branches with the successive jne.
52
5053***************************************************************************/
5154
5255
r18994r18995
5457#include "cpu/i86/i86.h"
5558#include "machine/pic8259.h"
5659#include "machine/pit8253.h"
57#include "machine/8237dma.h"
60#include "machine/am9517a.h"
5861#include "machine/upd765.h"
5962#include "video/upd7220.h"
6063#include "imagedev/flopdrv.h"
r18994r18995
7477      m_i8259_m(*this, "pic8259_master"),
7578      m_i8259_s(*this, "pic8259_slave"),
7679      m_fdc(*this, "upd765"),
77      m_dma(*this, "8237dma"),
80      m_dmac(*this, "i8237"),
7881      m_video_ram_1(*this, "video_ram_1"),
7982      m_video_ram_2(*this, "video_ram_2")
8083   { }
r18994r18995
8689   required_device<pic8259_device> m_i8259_m;
8790   required_device<pic8259_device> m_i8259_s;
8891   required_device<upd765a_device> m_fdc;
89   required_device<i8237_device> m_dma;
92   required_device<am9517a_device> m_dmac;
9093   UINT8 *m_char_rom;
9194
9295   required_shared_ptr<UINT8> m_video_ram_1;
r18994r18995
129132   DECLARE_DRIVER_INIT(apc);
130133   DECLARE_PALETTE_INIT(apc);
131134
132   int m_dma_channel;
133   UINT8 m_dma_offset[2][4];
134   UINT8 m_at_pages[0x10];
135   int m_dack;
136   UINT8 m_dma_offset[4];
135137
136138protected:
137139   // driver_device overrides
r18994r18995
339341
340342WRITE8_MEMBER(apc_state::apc_dma_segments_w)
341343{
342   m_dma_offset[0][offset & 3] = data & 0x0f;
344   m_dma_offset[offset & 3] = data & 0x0f;
343345}
344346
345347/*
r18994r18995
374376
375377READ8_MEMBER(apc_state::apc_dma_r)
376378{
377   return i8237_r(m_dma, space, BITSWAP8(offset,7,6,5,4,2,1,0,3));
379   return machine().device<am9517a_device>("i8237")->read(space, BITSWAP8(offset,7,6,5,4,2,1,0,3), 0xff);
378380}
379381
380382WRITE8_MEMBER(apc_state::apc_dma_w)
381383{
382   i8237_w(m_dma, space, BITSWAP8(offset,7,6,5,4,2,1,0,3), data);
384   machine().device<am9517a_device>("i8237")->write(space, BITSWAP8(offset,7,6,5,4,2,1,0,3), data, 0xff);
383385}
384386
385387
386388static ADDRESS_MAP_START( apc_map, AS_PROGRAM, 16, apc_state )
387   AM_RANGE(0x00000, 0x1ffff) AM_RAM
389   AM_RANGE(0x00000, 0x9ffff) AM_RAM
388390//   AM_RANGE(0xa0000, 0xaffff) space for an external ROM
389391   AM_RANGE(0xfe000, 0xfffff) AM_ROM AM_REGION("ipl", 0)
390392ADDRESS_MAP_END
r18994r18995
466468
467469void apc_state::fdc_drq(bool state)
468470{
469   printf("%02x DRQ\n",state);
470   i8237_dreq0_w(m_dma, state);
471//   printf("%02x DRQ\n",state);
472//   i8237_dreq0_w(m_dma, state);
473   m_dmac->dreq1_w(state);
474
471475}
472476
473477void apc_state::fdc_irq(bool state)
474478{
475   printf("IRQ %d\n",state);
479//   printf("IRQ %d\n",state);
476480   pic8259_ir3_w(machine().device("pic8259_slave"), state);
477481}
478482
r18994r18995
620624
621625WRITE_LINE_MEMBER(apc_state::apc_dma_hrq_changed)
622626{
623   machine().device("maincpu")->execute().set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE);
627   m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE);
624628
625   printf("%02x HLDA\n",state);
629   m_dmac->hack_w(state);
626630
627   /* Assert HLDA */
628   i8237_hlda_w( machine().device("dma8237"), state );
631//   printf("%02x HLDA\n",state);
629632}
630633
631634WRITE_LINE_MEMBER( apc_state::apc_tc_w )
632635{
633636   /* floppy terminal count */
634//   m_fdc->tc_w(!state);
637   m_fdc->tc_w(state);
638
635639   printf("TC %02x\n",state);
636640}
637641
638642READ8_MEMBER(apc_state::apc_dma_read_byte)
639643{
640   offs_t page_offset = (((offs_t) m_dma_offset[0][m_dma_channel]) << 16)
641      & 0xFF0000;
644   address_space &program = m_maincpu->space(AS_PROGRAM);
645   offs_t addr = (m_dma_offset[m_dack] << 16) | offset;
642646
643   return space.read_byte(page_offset + offset);
647   printf("%08x\n",addr);
648
649   return program.read_byte(addr);
644650}
645651
646652
647653WRITE8_MEMBER(apc_state::apc_dma_write_byte)
648654{
649   offs_t page_offset = (((offs_t) m_dma_offset[0][m_dma_channel]) << 16)
650      & 0xFF0000;
655   address_space &program = m_maincpu->space(AS_PROGRAM);
656   offs_t addr = (m_dma_offset[m_dack] << 16) | offset;
651657
652   space.write_byte(page_offset + offset, data);
658//   printf("%08x %02x\n",addr,data);
659
660   program.write_byte(addr, data);
653661}
654662
655663static void set_dma_channel(running_machine &machine, int channel, int state)
656664{
657665   apc_state *drvstate = machine.driver_data<apc_state>();
658   if (!state) drvstate->m_dma_channel = channel;
666   if (!state) drvstate->m_dack = channel;
659667}
660668
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); }
669WRITE_LINE_MEMBER(apc_state::apc_dack0_w){ /*printf("%02x 0\n",state);*/ set_dma_channel(machine(), 0, state); }
670WRITE_LINE_MEMBER(apc_state::apc_dack1_w){ /*printf("%02x 1\n",state);*/ set_dma_channel(machine(), 1, state); }
671WRITE_LINE_MEMBER(apc_state::apc_dack2_w){ /*printf("%02x 2\n",state);*/ set_dma_channel(machine(), 2, state); }
672WRITE_LINE_MEMBER(apc_state::apc_dack3_w){ /*printf("%02x 3\n",state);*/ set_dma_channel(machine(), 3, state); }
665673
666674READ8_MEMBER(apc_state::test_r)
667675{
668   printf("2dd DACK R\n");
676//   printf("2dd DACK R\n");
669677
670   return 0xff;
678   return m_fdc->dma_r();
671679}
672680
673681WRITE8_MEMBER(apc_state::test_w)
r18994r18995
675683   printf("2dd DACK W\n");
676684}
677685
678static I8237_INTERFACE( dma8237_config )
686static I8237_INTERFACE( dmac_intf )
679687{
680688   DEVCB_DRIVER_LINE_MEMBER(apc_state, apc_dma_hrq_changed),
681689   DEVCB_DRIVER_LINE_MEMBER(apc_state, apc_tc_w),
r18994r18995
719727   MCFG_PIT8253_ADD( "pit8253", pit8253_config )
720728   MCFG_PIC8259_ADD( "pic8259_master", pic8259_master_config )
721729   MCFG_PIC8259_ADD( "pic8259_slave", pic8259_slave_config )
722   MCFG_I8237_ADD("8237dma", MAIN_CLOCK, dma8237_config)
730   MCFG_I8237_ADD("i8237", MAIN_CLOCK, dmac_intf)
723731
724732   MCFG_UPD765A_ADD("upd765", true, true)
725733   MCFG_FLOPPY_DRIVE_ADD("upd765:0", apc_floppies, "8", 0, apc_floppy_formats)

Previous 199869 Revisions Next


© 1997-2024 The MAME Team