Previous 199869 Revisions Next

r31108 Thursday 26th June, 2014 at 00:23:24 UTC by Barry Rodewald
gimix: added support for Flex DSK disk images, will now boot Gimix Flex 3.3.
[src/lib]lib.mak
[src/lib/formats]flex_dsk.c* flex_dsk.h*
[src/mess/drivers]gimix.c

trunk/src/lib/formats/flex_dsk.c
r0r31108
1/*
2 * flex_dsk.c  -  FLEX compatible disk images
3 *
4 *  Created on: 24/06/2014
5 */
6
7#include "emu.h"
8#include "flex_dsk.h"
9
10flex_format::flex_format() : wd177x_format(formats)
11{
12}
13
14const char *flex_format::name() const
15{
16   return "flex";
17}
18
19const char *flex_format::description() const
20{
21   return "FLEX compatible disk image";
22}
23
24const char *flex_format::extensions() const
25{
26   return "dsk";
27}
28
29int flex_format::identify(io_generic *io, UINT32 form_factor)
30{
31   io_generic_read(io, &info, 256 * 2, sizeof(struct sysinfo_sector));
32
33   if(((info.last_trk+1) * info.last_sec) * 256 == io_generic_size(io))
34   {
35      logerror("flex_dsk: %i tracks, %i sectors\n",info.last_trk+1,info.last_sec);
36      return 100;
37   }
38   return 0;
39}
40
41bool flex_format::load(io_generic *io, UINT32 form_factor, floppy_image *image)
42{
43   int spt = info.last_sec;
44   int bps = 256;
45   int cell_count = 100000;
46   int offset = 0;
47
48   for(int track=0; track < info.last_trk+1; track++)
49   {
50      desc_pc_sector sects[80];
51      UINT8 sect_data[20000];
52      int sdatapos = 0;
53      for(int i=0; i<spt; i++)
54      {
55         sects[i].track       = track;
56         sects[i].head        = 0;  // no side select?
57         sects[i].sector      = i+1;
58         sects[i].size        = 1;
59         sects[i].actual_size = bps;
60         sects[i].deleted     = false;
61         sects[i].bad_crc     = false;
62         sects[i].data        = &sect_data[sdatapos];
63         io_generic_read(io, sects[i].data, offset, bps);
64         offset += bps;
65         sdatapos += bps;
66      }
67      // gap sizes unverified
68      build_wd_track_fm(track, 0, image, cell_count, spt, sects, 24, 16, 11);
69   }
70   return true;
71}
72
73const floppy_format_type FLOPPY_FLEX_FORMAT = &floppy_image_format_creator<flex_format>;
Property changes on: trunk/src/lib/formats/flex_dsk.c
Added: svn:eol-style
   + native
Added: svn:mime-type
   + text/plain
trunk/src/lib/formats/flex_dsk.h
r0r31108
1/*
2 * flex_dsk.h
3 *
4 *  Created on: 24/06/2014
5 *      Author: bsr
6 */
7
8#ifndef FLEX_DSK_H_
9#define FLEX_DSK_H_
10
11#include "wd177x_dsk.h"
12
13class flex_format : public wd177x_format {
14public:
15   flex_format();
16
17   virtual const char *name() const;
18   virtual const char *description() const;
19   virtual const char *extensions() const;
20   virtual int identify(io_generic *io, UINT32 form_factor);
21   virtual bool load(io_generic *io, UINT32 form_factor, floppy_image *image);
22private:
23//   static const format formats[];
24
25   struct sysinfo_sector
26   {
27      UINT8 unused1[16];
28      UINT8 disk_name[8];
29      UINT8 disk_ext[3];
30      UINT8 disk_number[2];
31      UINT8 fc_start_trk;
32      UINT8 fc_start_sec;
33      UINT8 fc_end_trk;
34      UINT8 fc_end_sec;
35      UINT8 free[2];
36      UINT8 month;
37      UINT8 day;
38      UINT8 year;
39      UINT8 last_trk;
40      UINT8 last_sec;
41      UINT8 unused2[216];
42   } info;
43};
44
45extern const floppy_format_type FLOPPY_FLEX_FORMAT;
46
47#endif /* FLEX_DSK_H_ */
Property changes on: trunk/src/lib/formats/flex_dsk.h
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/lib/lib.mak
r31107r31108
145145   $(LIBOBJ)/formats/esq16_dsk.o   \
146146   $(LIBOBJ)/formats/fc100_cas.o   \
147147   $(LIBOBJ)/formats/fdi_dsk.o     \
148   $(LIBOBJ)/formats/flex_dsk.o    \
148149   $(LIBOBJ)/formats/fm7_cas.o     \
149150   $(LIBOBJ)/formats/fmsx_cas.o    \
150151   $(LIBOBJ)/formats/fmtowns_dsk.o \
trunk/src/mess/drivers/gimix.c
r31107r31108
2727#include "machine/terminal.h"
2828#include "machine/bankdev.h"
2929#include "machine/ram.h"
30#include "formats/pc_dsk.h"
30#include "formats/flex_dsk.h"
3131
3232#define DMA_DRQ         (m_dma_status & 0x80)
3333#define DMA_INTRQ       (m_dma_status & 0x40)
r31107r31108
6060      : driver_device(mconfig, type, tag)
6161      , m_maincpu(*this, "maincpu")
6262      , m_fdc(*this, "fdc")
63      , m_floppy0(*this, "fdc:0")
64      , m_floppy1(*this, "fdc:1")
6365      , m_ram(*this, RAM_TAG)
6466      , m_rom(*this, "roms")
6567      , m_acia1(*this, "acia1")
r31107r31108
116118   UINT32 m_dma_current_addr;
117119   UINT8 m_task;
118120   UINT8 m_task_banks[16][16];
121   UINT8 m_selected_drive;
122   bool m_floppy0_ready;
123   bool m_floppy1_ready;
119124
120125   UINT8 m_pia1_pa;
121126   UINT8 m_pia1_pb;
r31107r31108
128133
129134   required_device<cpu_device> m_maincpu;
130135   required_device<fd1797_t> m_fdc;
136   required_device<floppy_connector> m_floppy0;
137   required_device<floppy_connector> m_floppy1;
131138   required_device<ram_device> m_ram;
132139   required_memory_region m_rom;
133140   required_device<acia6850_device> m_acia1;
r31107r31108
159166};
160167
161168static ADDRESS_MAP_START( gimix_banked_mem, AS_PROGRAM, 8, gimix_state)
162   //AM_RANGE(0x00000, 0x0dfff) AM_RAM
169   AM_RANGE(0x00000, 0x0dfff) AM_RAMBANK("lower_ram")
163170   AM_RANGE(0x0e000, 0x0e000) AM_DEVREADWRITE("acia1",acia6850_device,status_r,control_w)
164171   AM_RANGE(0x0e001, 0x0e001) AM_DEVREADWRITE("acia1",acia6850_device,data_r,data_w)
165172   AM_RANGE(0x0e004, 0x0e004) AM_DEVREADWRITE("acia2",acia6850_device,status_r,control_w)
166173   AM_RANGE(0x0e005, 0x0e005) AM_DEVREADWRITE("acia2",acia6850_device,data_r,data_w)
167   AM_RANGE(0x0e018, 0x0e01b) AM_RAM  // this area is used for "PROGRAMMED I/O BOOTSTRAP"
174   AM_RANGE(0x0e018, 0x0e01b) AM_READWRITE(fdc_r, fdc_w) // FD1797 FDC (PIO)
168175   AM_RANGE(0x0e100, 0x0e1ff) AM_RAM
169176   //AM_RANGE(0x0e200, 0x0e20f) // 9511A / 9512 Arithmetic Processor
170177   AM_RANGE(0x0e210, 0x0e21f) AM_DEVREADWRITE("timer",ptm6840_device,read,write)
r31107r31108
294301   case 0:
295302      logerror("DMA: Drive select %02x\n",data);
296303      m_dma_drive_select = data;
297      m_fdc->dden_w(DMA_DENSITY);
304      m_fdc->dden_w(DMA_DENSITY ? 1 : 0);
298305      if(data & 0x40)  // 8" / 5.25" connector select
299306         m_dma_status |= 0x04;
300307      else
301308         m_dma_status &= ~0x04;
302309      if(data & 0x01)
303         m_fdc->set_floppy(m_fdc->subdevice<floppy_connector>("0")->get_device());
310      {
311         m_fdc->set_floppy(m_floppy0->get_device());
312         m_selected_drive = 1;
313         m_floppy1->get_device()->mon_w(1);  // switch off the motor of other drives...
314         m_floppy1_ready = false;
315         logerror("FDC: Floppy drive 1 motor off\n");
316      }
304317      if(data & 0x02)
305         m_fdc->set_floppy(m_fdc->subdevice<floppy_connector>("1")->get_device());
318      {
319         m_fdc->set_floppy(m_floppy1->get_device());
320         m_selected_drive = 2;
321         m_floppy0->get_device()->mon_w(1);  // switch off the motor of other drives...
322         m_floppy0_ready = false;
323         logerror("FDC: Floppy drive 0 motor off\n");
324      }
306325      break;
307326   case 1:
308327      logerror("DMA: DMA control %02x\n",data);
r31107r31108
311330         m_dma_status |= 0x12;
312331      else
313332         m_dma_status &= ~0x12;
333      if(data & 0x40)
334      {
335         if(m_selected_drive == 1)
336            m_floppy0->get_device()->ss_w(1);
337         if(m_selected_drive == 2)
338            m_floppy1->get_device()->ss_w(1);
339      }
340      else
341      {
342         if(m_selected_drive == 1)
343            m_floppy0->get_device()->ss_w(0);
344         if(m_selected_drive == 2)
345            m_floppy1->get_device()->ss_w(0);
346      }
314347      break;
315348   case 2:
316349      logerror("DMA: DMA start address MSB %02x\n",data);
r31107r31108
330363READ8_MEMBER(gimix_state::fdc_r)
331364{
332365   // motors are switched on on FDC access
333   m_fdc->subdevice<floppy_connector>("0")->get_device()->mon_w(0);
334   m_fdc->subdevice<floppy_connector>("1")->get_device()->mon_w(0);
366   if(m_selected_drive == 1 && m_floppy0_ready == false)
367   {
368      m_floppy0->get_device()->mon_w(0);
369      m_floppy0_ready = true;
370      logerror("FDC: Floppy drive 0 motor on\n");
371   }
372   if(m_selected_drive == 2 && m_floppy1_ready == false)
373   {
374      m_floppy1->get_device()->mon_w(0);
375      m_floppy1_ready = true;
376      logerror("FDC: Floppy drive 1 motor on\n");
377   }
335378   return m_fdc->read(space,offset);
336379}
337380
338381WRITE8_MEMBER(gimix_state::fdc_w)
339382{
340383   // motors are switched on on FDC access
341   m_fdc->subdevice<floppy_connector>("0")->get_device()->mon_w(0);
342   m_fdc->subdevice<floppy_connector>("1")->get_device()->mon_w(0);
384   if(m_selected_drive == 1)
385      m_floppy0->get_device()->mon_w(0);
386   if(m_selected_drive == 2)
387      m_floppy1->get_device()->mon_w(0);
343388   m_fdc->write(space,offset,data);
344389}
345390
r31107r31108
381426
382427WRITE_LINE_MEMBER(gimix_state::fdc_drq_w)
383428{
384   if(state)
429   if(state && DMA_ENABLED)
385430   {
386431      m_dma_status |= 0x80;
387432      // do a DMA transfer
r31107r31108
389434      {
390435         // write to disk
391436         m_fdc->data_w(m_ram->read(m_dma_current_addr));
392         logerror("DMA: read from RAM %05x\n",m_dma_current_addr);
437//         logerror("DMA: read from RAM %05x\n",m_dma_current_addr);
393438      }
394439      else
395440      {
396441         // read from disk
397442         m_ram->write(m_dma_current_addr,m_fdc->data_r());
398         logerror("DMA: write to RAM %05x\n",m_dma_current_addr);
443//         logerror("DMA: write to RAM %05x\n",m_dma_current_addr);
399444      }
400445      m_dma_current_addr++;
401446   }
402447   else
403448      m_dma_status &= ~0x80;
404   logerror("DMA: DRQ set to %i\n",state);
405449}
406450
407451void gimix_state::machine_reset()
r31107r31108
414458   m_dma_status = 0x00;
415459   m_dma_ctrl = 0x00;
416460   m_task = 0x00;
461   m_selected_drive = 0;
462   m_floppy0_ready = false;
463   m_floppy1_ready = false;
464   membank("lower_ram")->set_base(m_ram->pointer());
465   membank("upper_ram")->set_base(m_ram->pointer()+0x10000);
417466}
418467
419468void gimix_state::machine_start()
r31107r31108
427476   m_rombank2->set_entry(1);
428477   m_rombank3->set_entry(2);
429478   m_fixedrombank->set_entry(0);
430   // install first 56k RAM
431   m_bank1->space(AS_PROGRAM).install_ram(0x0000,0xe000,0xffff,0,NULL);
432   m_bank2->space(AS_PROGRAM).install_ram(0x0000,0xe000,0xffff,0,NULL);
433   m_bank3->space(AS_PROGRAM).install_ram(0x0000,0xe000,0xffff,0,NULL);
434   m_bank4->space(AS_PROGRAM).install_ram(0x0000,0xe000,0xffff,0,NULL);
435   m_bank5->space(AS_PROGRAM).install_ram(0x0000,0xe000,0xffff,0,NULL);
436   m_bank6->space(AS_PROGRAM).install_ram(0x0000,0xe000,0xffff,0,NULL);
437   m_bank7->space(AS_PROGRAM).install_ram(0x0000,0xe000,0xffff,0,NULL);
438   m_bank8->space(AS_PROGRAM).install_ram(0x0000,0xe000,0xffff,0,NULL);
439   m_bank9->space(AS_PROGRAM).install_ram(0x0000,0xe000,0xffff,0,NULL);
440   m_bank10->space(AS_PROGRAM).install_ram(0x0000,0xe000,0xffff,0,NULL);
441   m_bank11->space(AS_PROGRAM).install_ram(0x0000,0xe000,0xffff,0,NULL);
442   m_bank12->space(AS_PROGRAM).install_ram(0x0000,0xe000,0xffff,0,NULL);
443   m_bank13->space(AS_PROGRAM).install_ram(0x0000,0xe000,0xffff,0,NULL);
444   m_bank14->space(AS_PROGRAM).install_ram(0x0000,0xe000,0xffff,0,NULL);
445   m_bank15->space(AS_PROGRAM).install_ram(0x0000,0xe000,0xffff,0,NULL);
446   m_bank16->space(AS_PROGRAM).install_ram(0x0000,0xe000,0xffff,0,NULL);
447479   // install any extra RAM
448480   if(m_ram->size() > 65536)
449481   {
450      m_bank1->space(AS_PROGRAM).install_ram(0x10000,m_ram->size()-1,0xffff,0,NULL);
451      m_bank2->space(AS_PROGRAM).install_ram(0x10000,m_ram->size()-1,0xffff,0,NULL);
452      m_bank3->space(AS_PROGRAM).install_ram(0x10000,m_ram->size()-1,0xffff,0,NULL);
453      m_bank4->space(AS_PROGRAM).install_ram(0x10000,m_ram->size()-1,0xffff,0,NULL);
454      m_bank5->space(AS_PROGRAM).install_ram(0x10000,m_ram->size()-1,0xffff,0,NULL);
455      m_bank6->space(AS_PROGRAM).install_ram(0x10000,m_ram->size()-1,0xffff,0,NULL);
456      m_bank7->space(AS_PROGRAM).install_ram(0x10000,m_ram->size()-1,0xffff,0,NULL);
457      m_bank8->space(AS_PROGRAM).install_ram(0x10000,m_ram->size()-1,0xffff,0,NULL);
458      m_bank9->space(AS_PROGRAM).install_ram(0x10000,m_ram->size()-1,0xffff,0,NULL);
459      m_bank10->space(AS_PROGRAM).install_ram(0x10000,m_ram->size()-1,0xffff,0,NULL);
460      m_bank11->space(AS_PROGRAM).install_ram(0x10000,m_ram->size()-1,0xffff,0,NULL);
461      m_bank12->space(AS_PROGRAM).install_ram(0x10000,m_ram->size()-1,0xffff,0,NULL);
462      m_bank13->space(AS_PROGRAM).install_ram(0x10000,m_ram->size()-1,0xffff,0,NULL);
463      m_bank14->space(AS_PROGRAM).install_ram(0x10000,m_ram->size()-1,0xffff,0,NULL);
464      m_bank15->space(AS_PROGRAM).install_ram(0x10000,m_ram->size()-1,0xffff,0,NULL);
465      m_bank16->space(AS_PROGRAM).install_ram(0x10000,m_ram->size()-1,0xffff,0,NULL);
482      m_bank1->space(AS_PROGRAM).install_readwrite_bank(0x10000,m_ram->size()-1,0xffff,0,"upper_ram");
483      m_bank2->space(AS_PROGRAM).install_readwrite_bank(0x10000,m_ram->size()-1,0xffff,0,"upper_ram");
484      m_bank3->space(AS_PROGRAM).install_readwrite_bank(0x10000,m_ram->size()-1,0xffff,0,"upper_ram");
485      m_bank4->space(AS_PROGRAM).install_readwrite_bank(0x10000,m_ram->size()-1,0xffff,0,"upper_ram");
486      m_bank5->space(AS_PROGRAM).install_readwrite_bank(0x10000,m_ram->size()-1,0xffff,0,"upper_ram");
487      m_bank6->space(AS_PROGRAM).install_readwrite_bank(0x10000,m_ram->size()-1,0xffff,0,"upper_ram");
488      m_bank7->space(AS_PROGRAM).install_readwrite_bank(0x10000,m_ram->size()-1,0xffff,0,"upper_ram");
489      m_bank8->space(AS_PROGRAM).install_readwrite_bank(0x10000,m_ram->size()-1,0xffff,0,"upper_ram");
490      m_bank9->space(AS_PROGRAM).install_readwrite_bank(0x10000,m_ram->size()-1,0xffff,0,"upper_ram");
491      m_bank10->space(AS_PROGRAM).install_readwrite_bank(0x10000,m_ram->size()-1,0xffff,0,"upper_ram");
492      m_bank11->space(AS_PROGRAM).install_readwrite_bank(0x10000,m_ram->size()-1,0xffff,0,"upper_ram");
493      m_bank12->space(AS_PROGRAM).install_readwrite_bank(0x10000,m_ram->size()-1,0xffff,0,"upper_ram");
494      m_bank13->space(AS_PROGRAM).install_readwrite_bank(0x10000,m_ram->size()-1,0xffff,0,"upper_ram");
495      m_bank14->space(AS_PROGRAM).install_readwrite_bank(0x10000,m_ram->size()-1,0xffff,0,"upper_ram");
496      m_bank15->space(AS_PROGRAM).install_readwrite_bank(0x10000,m_ram->size()-1,0xffff,0,"upper_ram");
497      m_bank16->space(AS_PROGRAM).install_readwrite_bank(0x10000,m_ram->size()-1,0xffff,0,"upper_ram");
466498   }
499   m_floppy0->get_device()->set_rpm(300);
500   m_floppy1->get_device()->set_rpm(300);
467501}
468502
469503void gimix_state::driver_start()
r31107r31108
479513}
480514
481515FLOPPY_FORMATS_MEMBER( gimix_state::floppy_formats )
482   FLOPPY_PC_FORMAT
516   FLOPPY_FLEX_FORMAT
483517FLOPPY_FORMATS_END
484518
485519static SLOT_INTERFACE_START( gimix_floppies )
r31107r31108
508542   MCFG_PTM6840_IRQ_CB(WRITELINE(gimix_state,irq_w))  // PCB pictures show both the RTC and timer set to generate IRQs (are jumper configurable)
509543
510544   /* floppy disks */
511   MCFG_FD1797x_ADD("fdc",XTAL_2MHz)
545   MCFG_FD1797x_ADD("fdc",XTAL_8MHz / 4)
512546   MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(gimix_state,fdc_irq_w))
513547   MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(gimix_state,fdc_drq_w))
548   MCFG_WD_FDC_FORCE_READY
514549   MCFG_FLOPPY_DRIVE_ADD("fdc:0", gimix_floppies, "525dd", gimix_state::floppy_formats)
515550   MCFG_FLOPPY_DRIVE_ADD("fdc:1", gimix_floppies, "525dd", gimix_state::floppy_formats)
516551

Previous 199869 Revisions Next


© 1997-2024 The MAME Team