Previous 199869 Revisions Next

r33972 Friday 19th December, 2014 at 23:55:14 UTC by Robbbert
(MESS) excalibur : starting to add floppy support (nw)
(note: using old wd17xx because new wd crashes when the disk is loaded up)
[src/lib]lib.mak
[src/lib/formats]excali64_dsk.c* excali64_dsk.h*
[src/mess/drivers]excali64.c

trunk/src/lib/formats/excali64_dsk.c
r0r242484
1// license:BSD-3-Clause
2// copyright-holders:Olivier Galibert
3/*********************************************************************
4
5    formats/excali64_dsk.c
6
7    Excalibur 64 disk image format
8
9*********************************************************************/
10
11#include "emu.h"
12#include "formats/excali64_dsk.h"
13
14excali64_format::excali64_format() : wd177x_format(formats)
15{
16}
17
18const char *excali64_format::name() const
19{
20   return "excali64";
21}
22
23const char *excali64_format::description() const
24{
25   return "Excalibur 64 disk image";
26}
27
28const char *excali64_format::extensions() const
29{
30   return "raw";
31}
32
33// Unverified gap sizes
34const excali64_format::format excali64_format::formats[] = {
35   {   /*  800K 19cm double density */
36      floppy_image::FF_525,  floppy_image::DSDD, floppy_image::MFM,
37      2000,  5, 80, 2, 1024, {}, 1, {}, 100, 22, 84
38   },
39   {}
40};
41
42const floppy_format_type FLOPPY_EXCALI64_FORMAT = &floppy_image_format_creator<excali64_format>;
trunk/src/lib/formats/excali64_dsk.h
r0r242484
1/*********************************************************************
2
3    formats/excali64_dsk.h
4
5    Excalibur 64 disk image format
6
7*********************************************************************/
8
9#ifndef EXCALI64_DSK_H_
10#define EXCALI64_DSK_H_
11
12#include "wd177x_dsk.h"
13
14class excali64_format : public wd177x_format {
15public:
16   excali64_format();
17
18   virtual const char *name() const;
19   virtual const char *description() const;
20   virtual const char *extensions() const;
21
22private:
23   static const format formats[];
24};
25
26extern const floppy_format_type FLOPPY_EXCALI64_FORMAT;
27
28#endif
trunk/src/lib/lib.mak
r242483r242484
148148   $(LIBOBJ)/formats/ep64_dsk.o    \
149149   $(LIBOBJ)/formats/esq8_dsk.o    \
150150   $(LIBOBJ)/formats/esq16_dsk.o   \
151   $(LIBOBJ)/formats/excali64_dsk.o\
151152   $(LIBOBJ)/formats/fc100_cas.o   \
152153   $(LIBOBJ)/formats/fdi_dsk.o     \
153154   $(LIBOBJ)/formats/fdd_dsk.o     \
trunk/src/mess/drivers/excali64.c
r242483r242484
2828
2929****************************************************************************/
3030
31#define NEWFDC 0
32
33
3134#include "emu.h"
3235#include "cpu/z80/z80.h"
3336#include "video/mc6845.h"
r242483r242484
4043#include "imagedev/cassette.h"
4144#include "sound/wave.h"
4245#include "sound/speaker.h"
46#include "machine/z80dma.h"
47#if NEWFDC
48#include "machine/wd_fdc.h"
49#include "formats/excali64_dsk.h"
50#else
51#include "machine/wd17xx.h"
52#include "imagedev/flopdrv.h"
53#include "formats/basicdsk.h"
54#endif
4355
44
4556class excali64_state : public driver_device
4657{
4758public:
r242483r242484
5263      , m_cass(*this, "cassette")
5364      , m_crtc(*this, "crtc")
5465      , m_io_keyboard(*this, "KEY")
66      , m_dma(*this, "dma")
67      , m_fdc(*this, "fdc")
68#if NEWFDC
69      , m_floppy0(*this, "fdc:0")
70      , m_floppy1(*this, "fdc:1")
71#endif
5572   { }
5673
5774   DECLARE_PALETTE_INIT(excali64);
r242483r242484
6178   DECLARE_READ8_MEMBER(port00_r);
6279   DECLARE_READ8_MEMBER(port50_r);
6380   DECLARE_WRITE8_MEMBER(port70_w);
81   DECLARE_WRITE8_MEMBER(porte4_w);
82   DECLARE_READ8_MEMBER(porte8_r);
83   DECLARE_WRITE8_MEMBER(portec_w);
84#if NEWFDC
85   DECLARE_FLOPPY_FORMATS(floppy_formats);
86#endif
87   DECLARE_WRITE_LINE_MEMBER(busreq_w);
88   DECLARE_READ8_MEMBER(memory_read_byte);
89   DECLARE_WRITE8_MEMBER(memory_write_byte);
90   DECLARE_READ8_MEMBER(io_read_byte);
91   DECLARE_WRITE8_MEMBER(io_write_byte);
6492   MC6845_UPDATE_ROW(update_row);
6593   DECLARE_WRITE_LINE_MEMBER(crtc_de);
6694   DECLARE_WRITE_LINE_MEMBER(crtc_vs);
r242483r242484
79107   required_device<cassette_image_device> m_cass;
80108   required_device<mc6845_device> m_crtc;
81109   required_ioport_array<8> m_io_keyboard;
110   required_device<z80dma_device> m_dma;
111#if NEWFDC
112   required_device<wd2793_t> m_fdc;
113   required_device<floppy_connector> m_floppy0;
114   required_device<floppy_connector> m_floppy1;
115#else
116   required_device<wd2793_device> m_fdc;
117#endif
82118};
83119
84120static ADDRESS_MAP_START(excali64_mem, AS_PROGRAM, 8, excali64_state)
r242483r242484
100136   AM_RANGE(0x50, 0x5f) AM_READ(port50_r)
101137   AM_RANGE(0x60, 0x63) AM_MIRROR(0x0c) AM_DEVREADWRITE("ppi", i8255_device, read, write)
102138   AM_RANGE(0x70, 0x7f) AM_WRITE(port70_w)
139   AM_RANGE(0xe0, 0xe3) AM_DEVREADWRITE("dma", z80dma_device, read, write)
140   AM_RANGE(0xe4, 0xe7) AM_WRITE(porte4_w)
141   AM_RANGE(0xe8, 0xeb) AM_READ(porte8_r)
142   AM_RANGE(0xec, 0xef) AM_WRITE(portec_w)
143#if NEWFDC
144   AM_RANGE(0xf0, 0xf3) AM_DEVREADWRITE("fdc", wd2793_t, read, write)
145#else
146   AM_RANGE(0xf0, 0xf3) AM_DEVREADWRITE("fdc", wd2793_device, read, write)
147#endif
103148ADDRESS_MAP_END
104149
105150
r242483r242484
185230   PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("7 &") PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&')
186231INPUT_PORTS_END
187232
233#if NEWFDC
234FLOPPY_FORMATS_MEMBER( excali64_state::floppy_formats )
235   FLOPPY_EXCALI64_FORMAT
236FLOPPY_FORMATS_END
237
238static SLOT_INTERFACE_START( excali64_floppies )
239   SLOT_INTERFACE( "525dd", FLOPPY_525_DD )
240SLOT_INTERFACE_END
241#else
242static LEGACY_FLOPPY_OPTIONS_START(excali64)
243   LEGACY_FLOPPY_OPTION(excali64_ds, "raw", "Excalibur 64 DS disk image", basicdsk_identify_default, basicdsk_construct_default, NULL,
244      HEADS([2])
245      TRACKS([80])
246      SECTORS([5])
247      SECTOR_LENGTH([1024])
248      FIRST_SECTOR_ID([1]))
249LEGACY_FLOPPY_OPTIONS_END
250
251static const floppy_interface excali64_floppy_interface =
252{
253   FLOPPY_STANDARD_5_25_DSDD,
254   LEGACY_FLOPPY_OPTIONS_NAME(excali64),
255   NULL
256};
257#endif
258
259READ8_MEMBER( excali64_state::porte8_r )
260{
261   return 0xff;
262}
263
264WRITE8_MEMBER( excali64_state::porte4_w )
265{
266//printf("%X ",data);
267#if NEWFDC
268   floppy_image_device *floppy = NULL;
269   if (BIT(data, 0)) floppy = m_floppy0->get_device();
270   //if (BIT(data, 1)) floppy = m_floppy1->get_device();
271   m_fdc->set_floppy(floppy);
272   if (floppy)
273      floppy->ss_w(BIT(data, 4));
274#else
275   UINT8 i;
276   for (i = 0; i < 4; i++)
277   {
278      if BIT(data, i)
279      {
280         m_fdc->set_drive(i);
281         break;
282      }
283   }
284   //if (data & 0x01) m_fdc->set_drive(0);
285   //if (data & 0x02) m_fdc->set_drive(1);
286   //if (data & 0x04) m_fdc->set_drive(2);
287   //if (data & 0x08) m_fdc->set_drive(3);
288   //if (data & 0x10) m_fdc->set_side((data & 0x10) >> 4);
289   const char *floppy_tags[4] = { FLOPPY_0, FLOPPY_1, FLOPPY_2, FLOPPY_3 };
290
291   m_fdc->dden_w(1);//!BIT(data, 6)); // we want double density
292   //if ((data & 0x04) == 0) // reset
293   //m_fdc->reset();
294
295   // bit 3 connected to pin 23 "HRDY" of FDC
296   // TEMP HACK, FDD motor and RDY FDC pin controlled by HLD pin of FDC
297   legacy_floppy_image_device *flop = subdevice<legacy_floppy_image_device>(floppy_tags[i]);
298   flop->floppy_mon_w(0); // motor on
299   flop->floppy_drive_set_ready_state(1, 0);
300#endif
301}
302
303WRITE8_MEMBER( excali64_state::portec_w )
304{
305}
306
307WRITE_LINE_MEMBER( excali64_state::busreq_w )
308{
309// since our Z80 has no support for BUSACK, we assume it is granted immediately
310   m_maincpu->set_input_line(Z80_INPUT_LINE_BUSRQ, state);
311   //m_maincpu->set_input_line(INPUT_LINE_HALT, state); // do we need this?
312   m_dma->bai_w(state); // tell dma that bus has been granted
313}
314
315READ8_MEMBER( excali64_state::memory_read_byte )
316{
317   address_space& prog_space = m_maincpu->space(AS_PROGRAM);
318   return prog_space.read_byte(offset);
319}
320
321WRITE8_MEMBER( excali64_state::memory_write_byte )
322{
323   address_space& prog_space = m_maincpu->space(AS_PROGRAM);
324   prog_space.write_byte(offset, data);
325}
326
327READ8_MEMBER( excali64_state::io_read_byte )
328{
329   address_space& prog_space = m_maincpu->space(AS_IO);
330   return prog_space.read_byte(offset);
331}
332
333WRITE8_MEMBER( excali64_state::io_write_byte )
334{
335   address_space& prog_space = m_maincpu->space(AS_IO);
336   prog_space.write_byte(offset, data);
337}
338
188339WRITE8_MEMBER( excali64_state::ppib_w )
189340{
190341   m_kbdrow = data;
r242483r242484
461612   MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
462613   MCFG_PALETTE_ADD("palette", 40)
463614   MCFG_PALETTE_INIT_OWNER(excali64_state, excali64)
464   //MCFG_PALETTE_ADD_BLACK_AND_WHITE("palette")
465615   MCFG_GFXDECODE_ADD("gfxdecode", "palette", excali64)
466616   MCFG_MC6845_ADD("crtc", MC6845, "screen", XTAL_16MHz / 16) // 1MHz for lowres; 2MHz for highres
467617   MCFG_MC6845_SHOW_BORDER_AREA(false)
r242483r242484
472622
473623   /* Devices */
474624   MCFG_CASSETTE_ADD( "cassette" )
475   MACHINE_CONFIG_END
625#if NEWFDC
626   MCFG_WD2793x_ADD("fdc", XTAL_16MHz / 16)
627   MCFG_FLOPPY_DRIVE_ADD("fdc:0", excali64_floppies, "525dd", floppy_image_device::default_floppy_formats)// excali64_state::floppy_formats)
628   MCFG_FLOPPY_DRIVE_ADD("fdc:1", excali64_floppies, "525dd", floppy_image_device::default_floppy_formats)
629#else
630   MCFG_DEVICE_ADD("fdc", WD2793, 0)
631   MCFG_WD17XX_DEFAULT_DRIVE4_TAGS
632   //MCFG_WD17XX_INTRQ_CALLBACK(WRITELINE(nascom1_state, nascom2_fdc_intrq_w))
633   //MCFG_WD17XX_DRQ_CALLBACK(WRITELINE(nascom1_state, nascom2_fdc_drq_w))
634   //MCFG_WD17XX_DDEN_CALLBACK(VCC)
635   MCFG_LEGACY_FLOPPY_4_DRIVES_ADD(excali64_floppy_interface)
636#endif
637   MCFG_DEVICE_ADD("dma", Z80DMA, XTAL_16MHz/4)
638   MCFG_Z80DMA_OUT_BUSREQ_CB(WRITELINE(excali64_state, busreq_w))
639   MCFG_Z80DMA_IN_MREQ_CB(READ8(excali64_state, memory_read_byte))
640   MCFG_Z80DMA_OUT_MREQ_CB(WRITE8(excali64_state, memory_write_byte))
641   MCFG_Z80DMA_IN_IORQ_CB(READ8(excali64_state, io_read_byte))
642   MCFG_Z80DMA_OUT_IORQ_CB(WRITE8(excali64_state, io_write_byte))
643MACHINE_CONFIG_END
476644
477645/* ROM definition */
478646ROM_START( excali64 )


Previous 199869 Revisions Next


© 1997-2024 The MAME Team