Previous 199869 Revisions Next

r30875 Saturday 7th June, 2014 at 09:57:00 UTC by Dirk Best
vtech1: Use the slot system for I/O and Memory expansion slots. Emulate
the newly dumped RS-232 cartridge. Add support for the WordPro
cartridge. Cleanup driver.
[src/emu/bus]bus.mak
[src/emu/bus/vtech/ioexp]carts.c* carts.h* ioexp.c* ioexp.h* joystick.c* joystick.h* printer.c* printer.h*
[src/emu/bus/vtech/memexp]carts.c* carts.h* floppy.c* floppy.h* memexp.c* memexp.h* memory.c* memory.h* rs232.c* rs232.h* wordpro.c* wordpro.h*
[src/lib/formats]vtech1_dsk.c
[src/mess]mess.lst mess.mak
[src/mess/drivers]vtech1.c

trunk/src/emu/bus/vtech/memexp/floppy.h
r0r30875
1/***************************************************************************
2
3   VTech Laser/VZ Floppy Controller Cartridge
4
5    license: MAME, GPL-2.0+
6    copyright-holders: Dirk Best
7
8   Laser DD 20
9    Dick Smith Electronics X-7304
10
11***************************************************************************/
12
13#pragma once
14
15#ifndef __VTECH_MEMEXP_FLOPPY_H__
16#define __VTECH_MEMEXP_FLOPPY_H__
17
18#include "emu.h"
19#include "memexp.h"
20#include "imagedev/flopdrv.h"
21
22
23//**************************************************************************
24//  TYPE DEFINITIONS
25//**************************************************************************
26
27// ======================> floppy_controller_device
28
29class floppy_controller_device : public device_t, public device_memexp_interface
30{
31public:
32   // construction/destruction
33   floppy_controller_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
34
35   DECLARE_READ8_MEMBER( floppy_r );
36   DECLARE_WRITE8_MEMBER( floppy_w );
37
38   // accessed from loadproc
39   int get_floppy_id(device_image_interface *image);
40   UINT8 m_fdc_wrprot[2];
41
42protected:
43   virtual const rom_entry *device_rom_region() const;
44   virtual machine_config_constructor device_mconfig_additions() const;
45   virtual void device_start();
46   virtual void device_reset();
47
48private:
49   static const int TRKSIZE_VZ = 0x9a0;   // arbitrary (actually from analyzing format)
50   static const int TRKSIZE_FM = 3172;      // size of a standard FM mode track
51
52   device_image_interface *get_floppy_device(int drive);
53   void put_track();
54   void get_track();
55
56   required_device<memexp_slot_device> m_memexp;
57   required_device<legacy_floppy_image_device> m_floppy0;
58   required_device<legacy_floppy_image_device> m_floppy1;
59
60   int m_drive;
61   UINT8 m_fdc_track_x2[2];
62   UINT8 m_fdc_status;
63   UINT8 m_fdc_data[TRKSIZE_FM];
64   int m_data;
65   int m_fdc_edge;
66   int m_fdc_bits;
67   int m_fdc_start;
68   int m_fdc_write;
69   int m_fdc_offs;
70   int m_fdc_latch;
71};
72
73// device type definition
74extern const device_type FLOPPY_CONTROLLER;
75
76#endif // __VTECH_MEMEXP_FLOPPY_H__
Property changes on: trunk/src/emu/bus/vtech/memexp/floppy.h
Added: svn:eol-style
   + native
Added: svn:mime-type
   + text/plain
trunk/src/emu/bus/vtech/memexp/memexp.h
r0r30875
1/***************************************************************************
2
3   VTech Laser/VZ Memory Expansion Slot
4
5    license: MAME, GPL-2.0+
6    copyright-holders: Dirk Best
7
8   44-pin slot
9
10   22  GND             23  NC
11   21  +5VDC           24  A11
12   20  /IORQ           25  A12
13   19  /RD             26  A13
14   18  /NMI            27  A14
15   17  /WAIT           28  A15
16   16  /MI             29  CLK
17   15  /RFSH           30  D4
18   14  D7              31  D3
19   13  D2              32  D5
20   12  A1              33  D6
21   11  A2              34  NC
22   10  A3              35  A0
23    9  A4              36  D0
24    8  A5              37  D1
25    7  A6              38  /INT
26    6  A7              39  /HALT
27    5  A8              40  /MERQ
28    4  A9              41  /WR
29    3  A10             42  /NC
30    2  /RESET          43  +9VDC
31    1  GND             44  NC
32
33***************************************************************************/
34
35#pragma once
36
37#ifndef __VTECH_MEMEXP_H__
38#define __VTECH_MEMEXP_H__
39
40#include "emu.h"
41
42
43//**************************************************************************
44//  INTERFACE CONFIGURATION MACROS
45//**************************************************************************
46
47#define MCFG_MEMEXP_SLOT_ADD(_tag) \
48   MCFG_DEVICE_ADD(_tag, MEMEXP_SLOT, 0) \
49   MCFG_DEVICE_SLOT_INTERFACE(memexp_slot_carts, NULL, false)
50
51#define MCFG_MEMEXP_SLOT_INT_HANDLER(_devcb) \
52   devcb = &memexp_device::set_int_handler(*device, DEVCB_##_devcb);
53
54#define MCFG_MEMEXP_SLOT_NMI_HANDLER(_devcb) \
55   devcb = &memexp_device::set_nmi_handler(*device, DEVCB_##_devcb);
56
57#define MCFG_MEMEXP_SLOT_RESET_HANDLER(_devcb) \
58   devcb = &memexp_device::set_reset_handler(*device, DEVCB_##_devcb);
59
60
61//**************************************************************************
62//  TYPE DEFINITIONS
63//**************************************************************************
64
65class device_memexp_interface;
66
67class memexp_slot_device : public device_t, public device_slot_interface
68{
69public:
70   // construction/destruction
71   memexp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
72   virtual ~memexp_slot_device();
73
74   void set_program_space(address_space *program);
75   void set_io_space(address_space *io);
76
77   // callbacks
78   template<class _Object> static devcb_base &set_int_handler(device_t &device, _Object object)
79      { return downcast<memexp_slot_device &>(device).m_int_handler.set_callback(object); }
80
81   template<class _Object> static devcb_base &set_nmi_handler(device_t &device, _Object object)
82      { return downcast<memexp_slot_device &>(device).m_nmi_handler.set_callback(object); }
83
84   template<class _Object> static devcb_base &set_reset_handler(device_t &device, _Object object)
85      { return downcast<memexp_slot_device &>(device).m_reset_handler.set_callback(object); }
86
87   // called from cart device
88   DECLARE_WRITE_LINE_MEMBER( int_w ) { m_int_handler(state); }
89   DECLARE_WRITE_LINE_MEMBER( nmi_w ) { m_nmi_handler(state); }
90   DECLARE_WRITE_LINE_MEMBER( reset_w ) { m_reset_handler(state); }
91
92   address_space *m_program;
93   address_space *m_io;
94
95protected:
96   // device-level overrides
97   virtual void device_start();
98   virtual void device_reset();
99
100   device_memexp_interface *m_cart;
101
102private:
103   devcb_write_line m_int_handler;
104   devcb_write_line m_nmi_handler;
105   devcb_write_line m_reset_handler;
106};
107
108// class representing interface-specific live memexp device
109class device_memexp_interface : public device_slot_card_interface
110{
111public:
112   // construction/destruction
113   device_memexp_interface(const machine_config &mconfig, device_t &device);
114   virtual ~device_memexp_interface();
115
116protected:
117   memexp_slot_device *m_slot;
118};
119
120// device type definition
121extern const device_type MEMEXP_SLOT;
122
123// include here so drivers don't need to
124#include "carts.h"
125
126#endif // __VTECH_MEMEXP_H__
Property changes on: trunk/src/emu/bus/vtech/memexp/memexp.h
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/emu/bus/vtech/memexp/rs232.h
r0r30875
1/***************************************************************************
2
3   Dick Smith VZ-200/300 RS-232 Cartridge
4
5    license: MAME, GPL-2.0+
6    copyright-holders: Dirk Best
7
8***************************************************************************/
9
10#pragma once
11
12#ifndef __VTECH_MEMEXP_RS232_H__
13#define __VTECH_MEMEXP_RS232_H__
14
15#include "emu.h"
16#include "memexp.h"
17#include "bus/rs232/rs232.h"
18
19
20//**************************************************************************
21//  TYPE DEFINITIONS
22//**************************************************************************
23
24// ======================> rs232_interface_device
25
26class rs232_interface_device : public device_t, public device_memexp_interface
27{
28public:
29   // construction/destruction
30   rs232_interface_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
31
32   DECLARE_WRITE_LINE_MEMBER( rs232_rx_w );
33   DECLARE_READ8_MEMBER( receive_data_r );
34   DECLARE_WRITE8_MEMBER( transmit_data_w );
35
36protected:
37   virtual const rom_entry *device_rom_region() const;
38   virtual machine_config_constructor device_mconfig_additions() const;
39   virtual void device_start();
40   virtual void device_reset();
41
42private:
43   required_device<rs232_port_device> m_rs232;
44
45   int m_rx;
46};
47
48// device type definition
49extern const device_type RS232_INTERFACE;
50
51#endif // __VTECH_MEMEXP_RS232_H__
Property changes on: trunk/src/emu/bus/vtech/memexp/rs232.h
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/emu/bus/vtech/memexp/carts.h
r0r30875
1/***************************************************************************
2
3   VTech Laser/VZ Memory Expansion Slot Devices
4
5***************************************************************************/
6
7#pragma once
8
9#ifndef __VTECH_MEMEXP_CARTS_H__
10#define __VTECH_MEMEXP_CARTS_H__
11
12#include "emu.h"
13
14#include "floppy.h"
15#include "memory.h"
16#include "rs232.h"
17#include "wordpro.h"
18
19SLOT_INTERFACE_EXTERN( memexp_slot_carts );
20
21#endif // __VTECH_MEMEXP_CARTS_H__
Property changes on: trunk/src/emu/bus/vtech/memexp/carts.h
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/emu/bus/vtech/memexp/wordpro.h
r0r30875
1/***************************************************************************
2
3   Dick Smith VZ-300 WordPro Cartridge
4
5    license: MAME, GPL-2.0+
6    copyright-holders: Dirk Best
7
8***************************************************************************/
9
10#pragma once
11
12#ifndef __VTECH_MEMEXP_WORDPRO_H__
13#define __VTECH_MEMEXP_WORDPRO_H__
14
15#include "emu.h"
16#include "memexp.h"
17
18
19//**************************************************************************
20//  TYPE DEFINITIONS
21//**************************************************************************
22
23// ======================> wordpro_device
24
25class wordpro_device : public device_t, public device_memexp_interface
26{
27public:
28   // construction/destruction
29   wordpro_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
30
31protected:
32   virtual const rom_entry *device_rom_region() const;
33   virtual void device_start();
34   virtual void device_reset();
35};
36
37// device type definition
38extern const device_type WORDPRO;
39
40#endif // __VTECH_MEMEXP_WORDPRO_H__
Property changes on: trunk/src/emu/bus/vtech/memexp/wordpro.h
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/emu/bus/vtech/memexp/memory.c
r0r30875
1/***************************************************************************
2
3   VTech Laser/VZ Laser Memory Expansions
4
5    license: MAME, GPL-2.0+
6    copyright-holders: Dirk Best
7
8***************************************************************************/
9
10#include "memory.h"
11
12
13//**************************************************************************
14//  DEVICE DEFINITIONS
15//**************************************************************************
16
17const device_type LASER110_16K = &device_creator<laser110_16k_device>;
18const device_type LASER210_16K = &device_creator<laser210_16k_device>;
19const device_type LASER310_16K = &device_creator<laser310_16k_device>;
20const device_type LASER_64K = &device_creator<laser_64k_device>;
21
22
23//**************************************************************************
24//  LASER 110 16K DEVICE
25//**************************************************************************
26
27//-------------------------------------------------
28//  laser110_16k_device - constructor
29//-------------------------------------------------
30
31laser110_16k_device::laser110_16k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
32   device_t(mconfig, LASER110_16K, "Laser 110/200/VZ-200 16k Memory", tag, owner, clock, "laser110_16k", __FILE__),
33   device_memexp_interface(mconfig, *this)
34{
35}
36
37//-------------------------------------------------
38//  device_start - device-specific startup
39//-------------------------------------------------
40
41void laser110_16k_device::device_start()
42{
43   m_ram.resize(16 * 1024);
44}
45
46//-------------------------------------------------
47//  device_reset - device-specific reset
48//-------------------------------------------------
49
50void laser110_16k_device::device_reset()
51{
52   m_slot->m_program->install_ram(0x8000, 0xbfff, m_ram);
53}
54
55
56//**************************************************************************
57//  LASER 210 16K DEVICE
58//**************************************************************************
59
60//-------------------------------------------------
61//  laser210_16k_device - constructor
62//-------------------------------------------------
63
64laser210_16k_device::laser210_16k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
65   device_t(mconfig, LASER210_16K, "Laser 210/VZ-200 (DSE) 16k Memory", tag, owner, clock, "laser210_16k", __FILE__),
66   device_memexp_interface(mconfig, *this)
67{
68}
69
70//-------------------------------------------------
71//  device_start - device-specific startup
72//-------------------------------------------------
73
74void laser210_16k_device::device_start()
75{
76   m_ram.resize(16 * 1024);
77}
78
79//-------------------------------------------------
80//  device_reset - device-specific reset
81//-------------------------------------------------
82
83void laser210_16k_device::device_reset()
84{
85   m_slot->m_program->install_ram(0x9000, 0xcfff, m_ram);
86}
87
88
89//**************************************************************************
90//  VZ300 16K DEVICE
91//**************************************************************************
92
93//-------------------------------------------------
94//  laser310_16k_device - constructor
95//-------------------------------------------------
96
97laser310_16k_device::laser310_16k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
98   device_t(mconfig, LASER310_16K, "Laser 310/VZ-300 16k Memory", tag, owner, clock, "laser310_16k", __FILE__),
99   device_memexp_interface(mconfig, *this)
100{
101}
102
103//-------------------------------------------------
104//  device_start - device-specific startup
105//-------------------------------------------------
106
107void laser310_16k_device::device_start()
108{
109   m_ram.resize(16 * 1024);
110}
111
112//-------------------------------------------------
113//  device_reset - device-specific reset
114//-------------------------------------------------
115
116void laser310_16k_device::device_reset()
117{
118   m_slot->m_program->install_ram(0xb800, 0xf7ff, m_ram);
119}
120
121
122//**************************************************************************
123//  VZ300 64K DEVICE
124//**************************************************************************
125
126//-------------------------------------------------
127//  laser_64k_device - constructor
128//-------------------------------------------------
129
130laser_64k_device::laser_64k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
131   device_t(mconfig, LASER_64K, "Laser/VZ 64k Memory", tag, owner, clock, "laser_64k", __FILE__),
132   device_memexp_interface(mconfig, *this)
133{
134}
135
136//-------------------------------------------------
137//  device_start - device-specific startup
138//-------------------------------------------------
139
140void laser_64k_device::device_start()
141{
142   m_ram.resize(64 * 1024);
143}
144
145//-------------------------------------------------
146//  device_reset - device-specific reset
147//-------------------------------------------------
148
149void laser_64k_device::device_reset()
150{
151   // fixed first bank
152   m_slot->m_program->install_ram(0x8000, 0xbfff, m_ram);
153
154   // other banks
155   m_slot->m_program->install_readwrite_bank(0xc000, 0xffff, tag());
156
157   membank(tag())->configure_entries(0, 4, m_ram, 0x4000);
158   membank(tag())->set_entry(1);
159
160   // bank switch
161   m_slot->m_io->install_write_handler(0x70, 0x7f, write8_delegate(FUNC(laser_64k_device::bankswitch_w), this));
162}
163
164WRITE8_MEMBER( laser_64k_device::bankswitch_w )
165{
166   membank(tag())->set_entry(data & 0x03);
167}
Property changes on: trunk/src/emu/bus/vtech/memexp/memory.c
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/emu/bus/vtech/memexp/floppy.c
r0r30875
1/***************************************************************************
2
3   VTech Laser/VZ Floppy Controller Cartridge
4
5    license: MAME, GPL-2.0+
6    copyright-holders: Dirk Best
7
8   Laser DD 20
9    Dick Smith Electronics X-7304
10
11    TODO: Broken currently, fix & modernize
12
13***************************************************************************/
14
15#include "floppy.h"
16#include "formats/vtech1_dsk.h"
17
18
19//**************************************************************************
20//  CONSTANTS / MACROS
21//**************************************************************************
22
23#define VERBOSE   1
24
25#define PHI0(n) (((n) >> 0) & 1)
26#define PHI1(n) (((n) >> 1) & 1)
27#define PHI2(n) (((n) >> 2) & 1)
28#define PHI3(n) (((n) >> 3) & 1)
29
30
31//**************************************************************************
32//  FUNCTION PROTOTYPES
33//**************************************************************************
34
35static void laser_load_proc(device_image_interface &image);
36
37
38//**************************************************************************
39//  DEVICE DEFINITIONS
40//**************************************************************************
41
42const device_type FLOPPY_CONTROLLER = &device_creator<floppy_controller_device>;
43
44//-------------------------------------------------
45//  rom_region - device-specific ROM region
46//-------------------------------------------------
47
48ROM_START( floppy )
49   ROM_REGION(0x3000, "software", 0)
50   ROM_LOAD("vzdos.rom", 0x0000, 0x2000, CRC(b6ed6084) SHA1(59d1cbcfa6c5e1906a32704fbf0d9670f0d1fd8b))
51ROM_END
52
53const rom_entry *floppy_controller_device::device_rom_region() const
54{
55   return ROM_NAME( floppy );
56}
57
58//-------------------------------------------------
59//  machine_config_additions - device-specific
60//  machine configurations
61//-------------------------------------------------
62
63static const floppy_interface laser_floppy_interface =
64{
65   FLOPPY_STANDARD_5_25_DSHD,
66   LEGACY_FLOPPY_OPTIONS_NAME(vtech1_only),
67   NULL
68};
69
70static MACHINE_CONFIG_FRAGMENT( floppy_controller )
71   MCFG_MEMEXP_SLOT_ADD("mem")
72   MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(laser_floppy_interface)
73MACHINE_CONFIG_END
74
75machine_config_constructor floppy_controller_device::device_mconfig_additions() const
76{
77   return MACHINE_CONFIG_NAME( floppy_controller );
78}
79
80
81//**************************************************************************
82//  LIVE DEVICE
83//**************************************************************************
84
85//-------------------------------------------------
86//  floppy_controller_device - constructor
87//-------------------------------------------------
88
89floppy_controller_device::floppy_controller_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
90   device_t(mconfig, FLOPPY_CONTROLLER, "Laser/VZ Floppy Disk Controller", tag, owner, clock, "laserfdc", __FILE__),
91   device_memexp_interface(mconfig, *this),
92   m_memexp(*this, "mem"),
93   m_floppy0(*this, "floppy0"),
94   m_floppy1(*this, "floppy1")
95{
96}
97
98//-------------------------------------------------
99//  device_start - device-specific startup
100//-------------------------------------------------
101
102void floppy_controller_device::device_start()
103{
104   m_drive = -1;
105   m_fdc_track_x2[0] = 80;
106   m_fdc_track_x2[1] = 80;
107   m_fdc_wrprot[0] = 0x80;
108   m_fdc_wrprot[1] = 0x80;
109   m_fdc_status = 0;
110   m_fdc_edge = 0;
111   m_fdc_bits = 8;
112   m_fdc_start = 0;
113   m_fdc_write = 0;
114   m_fdc_offs = 0;
115   m_fdc_latch = 0;
116
117   m_floppy0->floppy_install_load_proc(laser_load_proc);
118   m_floppy1->floppy_install_load_proc(laser_load_proc);
119}
120
121//-------------------------------------------------
122//  device_reset - device-specific reset
123//-------------------------------------------------
124
125void floppy_controller_device::device_reset()
126{
127   m_memexp->set_io_space(m_slot->m_io);
128   m_memexp->set_program_space(m_slot->m_program);
129
130   m_slot->m_program->install_rom(0x4000, 0x5fff, memregion("software")->base());
131
132   m_slot->m_io->install_read_handler(0x10, 0x1f, read8_delegate(FUNC(floppy_controller_device::floppy_r), this));
133   m_slot->m_io->install_write_handler(0x10, 0x1f, write8_delegate(FUNC(floppy_controller_device::floppy_w), this));
134}
135
136
137//**************************************************************************
138//  IMPLEMENTATION
139//**************************************************************************
140
141int floppy_controller_device::get_floppy_id(device_image_interface *image)
142{
143   if (image == dynamic_cast<device_image_interface *>(m_floppy0.target()))
144      return 0;
145   if (image == dynamic_cast<device_image_interface *>(m_floppy1.target()))
146      return 1;
147
148   return -1;
149}
150
151device_image_interface *floppy_controller_device::get_floppy_device(int drive)
152{
153   device_image_interface *image = NULL;
154
155   switch (drive)
156   {
157   case 0:
158      image = dynamic_cast<device_image_interface *>(m_floppy0.target());
159      break;
160
161   case 1:
162      image = dynamic_cast<device_image_interface *>(m_floppy1.target());
163      break;
164   }
165
166   return image;
167}
168
169static void laser_load_proc(device_image_interface &image)
170{
171   floppy_controller_device *fdc = dynamic_cast<floppy_controller_device *>(image.device().owner());
172
173   int id = fdc->get_floppy_id(&image);
174
175   if (!image.is_readonly())
176      fdc->m_fdc_wrprot[id] = 0x00;
177   else
178      fdc->m_fdc_wrprot[id] = 0x80;
179}
180
181void floppy_controller_device::get_track()
182{
183   device_image_interface *image = get_floppy_device(m_drive);
184
185   /* drive selected or and image file ok? */
186   if (m_drive >= 0 && image->exists())
187   {
188      int size, offs;
189      size = TRKSIZE_VZ;
190      offs = TRKSIZE_VZ * m_fdc_track_x2[m_drive]/2;
191      image->fseek(offs, SEEK_SET);
192         // some disks have slightly larger header, make sure we capture the checksum at the end of the track
193      size = image->fread(m_fdc_data, size+4);
194      if (VERBOSE)
195         logerror("get track @$%05x $%04x bytes\n", offs, size);
196   }
197   m_fdc_offs = 0;
198   m_fdc_write = 0;
199}
200
201void floppy_controller_device::put_track()
202{
203   /* drive selected and image file ok? */
204   if (m_drive >= 0 && floppy_get_device(machine(),m_drive) != NULL)
205   {
206      int size, offs;
207      device_image_interface *image = get_floppy_device(m_drive);
208      offs = TRKSIZE_VZ * m_fdc_track_x2[m_drive]/2;
209      image->fseek(offs + m_fdc_start, SEEK_SET);
210      size = image->fwrite(&m_fdc_data[m_fdc_start], m_fdc_write);
211      if (VERBOSE)
212         logerror("put track @$%05X+$%X $%04X/$%04X bytes\n", offs, m_fdc_start, size, m_fdc_write);
213   }
214}
215
216READ8_MEMBER( floppy_controller_device::floppy_r )
217{
218   int data = 0xff;
219
220   switch (offset)
221   {
222   case 1: /* data (read-only) */
223      if (m_fdc_bits > 0)
224      {
225         if( m_fdc_status & 0x80 )
226            m_fdc_bits--;
227         data = (m_data >> m_fdc_bits) & 0xff;
228         if (VERBOSE) {
229            logerror("vtech1_fdc_r bits %d%d%d%d%d%d%d%d\n",
230               (data>>7)&1,(data>>6)&1,(data>>5)&1,(data>>4)&1,
231               (data>>3)&1,(data>>2)&1,(data>>1)&1,(data>>0)&1 );
232         }
233      }
234      if (m_fdc_bits == 0)
235      {
236         m_data = m_fdc_data[m_fdc_offs];
237         if (VERBOSE)
238            logerror("vtech1_fdc_r %d : data ($%04X) $%02X\n", offset, m_fdc_offs, m_data);
239         if(m_fdc_status & 0x80)
240         {
241            m_fdc_bits = 8;
242            m_fdc_offs = (m_fdc_offs + 1) % TRKSIZE_FM;
243         }
244         m_fdc_status &= ~0x80;
245      }
246      break;
247   case 2: /* polling (read-only) */
248      /* fake */
249      if (m_drive >= 0)
250         m_fdc_status |= 0x80;
251      data = m_fdc_status;
252      break;
253   case 3: /* write protect status (read-only) */
254      if (m_drive >= 0)
255         data = m_fdc_wrprot[m_drive];
256      if (VERBOSE)
257         logerror("vtech1_fdc_r %d : write_protect $%02X\n", offset, data);
258      break;
259   }
260   return data;
261}
262
263WRITE8_MEMBER( floppy_controller_device::floppy_w )
264{
265   int drive;
266
267   switch (offset)
268   {
269   case 0: /* latch (write-only) */
270      drive = (data & 0x10) ? 0 : (data & 0x80) ? 1 : -1;
271      if (drive != m_drive)
272      {
273         m_drive = drive;
274         if (m_drive >= 0)
275            get_track();
276      }
277      if (m_drive >= 0)
278      {
279         if ((PHI0(data) && !(PHI1(data) || PHI2(data) || PHI3(data)) && PHI1(m_fdc_latch)) ||
280            (PHI1(data) && !(PHI0(data) || PHI2(data) || PHI3(data)) && PHI2(m_fdc_latch)) ||
281            (PHI2(data) && !(PHI0(data) || PHI1(data) || PHI3(data)) && PHI3(m_fdc_latch)) ||
282            (PHI3(data) && !(PHI0(data) || PHI1(data) || PHI2(data)) && PHI0(m_fdc_latch)))
283         {
284            if (m_fdc_track_x2[m_drive] > 0)
285               m_fdc_track_x2[m_drive]--;
286            if (VERBOSE)
287               logerror("vtech1_fdc_w(%d) $%02X drive %d: stepout track #%2d.%d\n", offset, data, m_drive, m_fdc_track_x2[m_drive]/2,5*(m_fdc_track_x2[m_drive]&1));
288            if ((m_fdc_track_x2[m_drive] & 1) == 0)
289               get_track();
290         }
291         else
292         if ((PHI0(data) && !(PHI1(data) || PHI2(data) || PHI3(data)) && PHI3(m_fdc_latch)) ||
293            (PHI1(data) && !(PHI0(data) || PHI2(data) || PHI3(data)) && PHI0(m_fdc_latch)) ||
294            (PHI2(data) && !(PHI0(data) || PHI1(data) || PHI3(data)) && PHI1(m_fdc_latch)) ||
295            (PHI3(data) && !(PHI0(data) || PHI1(data) || PHI2(data)) && PHI2(m_fdc_latch)))
296         {
297            if (m_fdc_track_x2[m_drive] < 2*40)
298               m_fdc_track_x2[m_drive]++;
299            if (VERBOSE)
300               logerror("vtech1_fdc_w(%d) $%02X drive %d: stepin track #%2d.%d\n", offset, data, m_drive, m_fdc_track_x2[m_drive]/2,5*(m_fdc_track_x2[m_drive]&1));
301            if ((m_fdc_track_x2[m_drive] & 1) == 0)
302               get_track();
303         }
304         if ((data & 0x40) == 0)
305         {
306            m_data <<= 1;
307            if ((m_fdc_latch ^ data) & 0x20)
308               m_data |= 1;
309            if ((m_fdc_edge ^= 1) == 0)
310            {
311               m_fdc_bits--;
312
313               if (m_fdc_bits == 0)
314               {
315                  UINT8 value = 0;
316                  m_data &= 0xffff;
317                  if (m_data & 0x4000 ) value |= 0x80;
318                  if (m_data & 0x1000 ) value |= 0x40;
319                  if (m_data & 0x0400 ) value |= 0x20;
320                  if (m_data & 0x0100 ) value |= 0x10;
321                  if (m_data & 0x0040 ) value |= 0x08;
322                  if (m_data & 0x0010 ) value |= 0x04;
323                  if (m_data & 0x0004 ) value |= 0x02;
324                  if (m_data & 0x0001 ) value |= 0x01;
325                  if (VERBOSE)
326                     logerror("vtech1_fdc_w(%d) data($%04X) $%02X <- $%02X ($%04X)\n", offset, m_fdc_offs, m_fdc_data[m_fdc_offs], value, m_data);
327                  m_fdc_data[m_fdc_offs] = value;
328                  m_fdc_offs = (m_fdc_offs + 1) % TRKSIZE_FM;
329                  m_fdc_write++;
330                  m_fdc_bits = 8;
331               }
332            }
333         }
334         /* change of write signal? */
335         if ((m_fdc_latch ^ data) & 0x40)
336         {
337            /* falling edge? */
338            if (m_fdc_latch & 0x40)
339            {
340               m_fdc_start = m_fdc_offs;
341               m_fdc_edge = 0;
342            }
343            else
344            {
345               /* data written to track before? */
346               if (m_fdc_write)
347                  put_track();
348            }
349            m_fdc_bits = 8;
350            m_fdc_write = 0;
351         }
352      }
353      m_fdc_latch = data;
354      break;
355   }
356}
Property changes on: trunk/src/emu/bus/vtech/memexp/floppy.c
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/emu/bus/vtech/memexp/memexp.c
r0r30875
1/***************************************************************************
2
3   VTech Laser/VZ Memory Expansion Slot
4
5    license: MAME, GPL-2.0+
6    copyright-holders: Dirk Best
7
8   44-pin slot
9
10***************************************************************************/
11
12#include "memexp.h"
13
14
15//**************************************************************************
16//  DEVICE DEFINITIONS
17//**************************************************************************
18
19const device_type MEMEXP_SLOT = &device_creator<memexp_slot_device>;
20
21
22//**************************************************************************
23//  SLOT DEVICE
24//**************************************************************************
25
26//-------------------------------------------------
27//  memexp_slot_device - constructor
28//-------------------------------------------------
29
30memexp_slot_device::memexp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
31   device_t(mconfig, MEMEXP_SLOT, "Memory Expansion Slot", tag, owner, clock, "memexp_slot", __FILE__),
32   device_slot_interface(mconfig, *this),
33   m_program(NULL),
34   m_io(NULL),
35   m_cart(NULL),
36   m_int_handler(*this),
37   m_nmi_handler(*this),
38   m_reset_handler(*this)
39{
40}
41
42//-------------------------------------------------
43//  memexp_slot_device - destructor
44//-------------------------------------------------
45
46memexp_slot_device::~memexp_slot_device()
47{
48}
49
50//-------------------------------------------------
51//  device_start - device-specific startup
52//-------------------------------------------------
53
54void memexp_slot_device::device_start()
55{
56   // resolve callbacks
57   m_int_handler.resolve_safe();
58   m_nmi_handler.resolve_safe();
59   m_reset_handler.resolve_safe();
60}
61
62//-------------------------------------------------
63//  device_reset - device-specific reset
64//-------------------------------------------------
65
66void memexp_slot_device::device_reset()
67{
68}
69
70//-------------------------------------------------
71//  set_program_space - set address space we are attached to
72//-------------------------------------------------
73
74void memexp_slot_device::set_program_space(address_space *program)
75{
76   m_program = program;
77}
78
79//-------------------------------------------------
80//  set_io_space - set address space we are attached to
81//-------------------------------------------------
82
83void memexp_slot_device::set_io_space(address_space *io)
84{
85   m_io = io;
86}
87
88
89//**************************************************************************
90//  CARTRIDGE INTERFACE
91//**************************************************************************
92
93//-------------------------------------------------
94//  device_memexp_interface - constructor
95//-------------------------------------------------
96
97device_memexp_interface::device_memexp_interface(const machine_config &mconfig, device_t &device) :
98   device_slot_card_interface(mconfig, device)
99{
100   m_slot = dynamic_cast<memexp_slot_device *>(device.owner());
101}
102
103//-------------------------------------------------
104//  ~device_memexp_interface - destructor
105//-------------------------------------------------
106
107device_memexp_interface::~device_memexp_interface()
108{
109}
Property changes on: trunk/src/emu/bus/vtech/memexp/memexp.c
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/emu/bus/vtech/memexp/rs232.c
r0r30875
1/***************************************************************************
2
3   Dick Smith VZ-200/300 RS-232 Cartridge
4
5    license: MAME, GPL-2.0+
6    copyright-holders: Dirk Best
7
8***************************************************************************/
9
10#include "rs232.h"
11
12
13//**************************************************************************
14//  DEVICE DEFINITIONS
15//**************************************************************************
16
17const device_type RS232_INTERFACE = &device_creator<rs232_interface_device>;
18
19//-------------------------------------------------
20//  rom_region - device-specific ROM region
21//-------------------------------------------------
22
23ROM_START( rs232 )
24   ROM_REGION(0x800, "software", 0)
25   ROM_LOAD("rs232_v15.ic2", 0x000, 0x800, CRC(6545260d) SHA1(4042f6f1e09e383f3c92f628c6187dc5f072fdb2))
26ROM_END
27
28const rom_entry *rs232_interface_device::device_rom_region() const
29{
30   return ROM_NAME( rs232 );
31}
32
33//-------------------------------------------------
34//  machine_config_additions - device-specific
35//  machine configurations
36//-------------------------------------------------
37
38static MACHINE_CONFIG_FRAGMENT( rs232 )
39   MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, NULL)
40   MCFG_RS232_RXD_HANDLER(WRITELINE(rs232_interface_device, rs232_rx_w))
41MACHINE_CONFIG_END
42
43machine_config_constructor rs232_interface_device::device_mconfig_additions() const
44{
45   return MACHINE_CONFIG_NAME( rs232 );
46}
47
48
49//**************************************************************************
50//  LIVE DEVICE
51//**************************************************************************
52
53//-------------------------------------------------
54//  wordpro_device - constructor
55//-------------------------------------------------
56
57rs232_interface_device::rs232_interface_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
58   device_t(mconfig, RS232_INTERFACE, "DSE VZ-200/300 RS-232 Interface", tag, owner, clock, "vz_rs232", __FILE__),
59   device_memexp_interface(mconfig, *this),
60   m_rs232(*this, "rs232"),
61   m_rx(1)
62{
63}
64
65//-------------------------------------------------
66//  device_start - device-specific startup
67//-------------------------------------------------
68
69void rs232_interface_device::device_start()
70{
71}
72
73//-------------------------------------------------
74//  device_reset - device-specific reset
75//-------------------------------------------------
76
77void rs232_interface_device::device_reset()
78{
79   // program
80   m_slot->m_program->install_rom(0x4000, 0x47ff, 0, 0x800, memregion("software")->base());
81
82   // data
83   m_slot->m_program->install_read_handler(0x5000, 0x57ff, read8_delegate(FUNC(rs232_interface_device::receive_data_r), this));
84   m_slot->m_program->install_write_handler(0x5800, 0x5fff, write8_delegate(FUNC(rs232_interface_device::transmit_data_w), this));
85}
86
87
88//**************************************************************************
89//  IMPLEMENTATION
90//**************************************************************************
91
92WRITE_LINE_MEMBER( rs232_interface_device::rs232_rx_w )
93{
94   m_rx = state;
95}
96
97READ8_MEMBER( rs232_interface_device::receive_data_r )
98{
99   return 0x7f | (m_rx << 7);
100}
101
102WRITE8_MEMBER( rs232_interface_device::transmit_data_w )
103{
104   m_rs232->write_txd(!BIT(data, 7));
105}
Property changes on: trunk/src/emu/bus/vtech/memexp/rs232.c
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/emu/bus/vtech/memexp/carts.c
r0r30875
1/***************************************************************************
2
3   VTech Laser/VZ Memory Expansion Slot Devices
4
5***************************************************************************/
6
7#include "carts.h"
8
9SLOT_INTERFACE_START( memexp_slot_carts )
10   SLOT_INTERFACE("floppy", FLOPPY_CONTROLLER)
11   SLOT_INTERFACE("laser110_16k", LASER110_16K)
12   SLOT_INTERFACE("laser210_16k", LASER210_16K)
13   SLOT_INTERFACE("laser310_16k", LASER310_16K)
14   SLOT_INTERFACE("laser_64k", LASER_64K)
15   SLOT_INTERFACE("rs232", RS232_INTERFACE)
16   SLOT_INTERFACE("wordpro", WORDPRO)
17SLOT_INTERFACE_END
Property changes on: trunk/src/emu/bus/vtech/memexp/carts.c
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/emu/bus/vtech/memexp/wordpro.c
r0r30875
1/***************************************************************************
2
3   Dick Smith VZ-300 WordPro Cartridge
4
5    license: MAME, GPL-2.0+
6    copyright-holders: Dirk Best
7
8***************************************************************************/
9
10#include "wordpro.h"
11
12
13//**************************************************************************
14//  DEVICE DEFINITIONS
15//**************************************************************************
16
17const device_type WORDPRO = &device_creator<wordpro_device>;
18
19//-------------------------------------------------
20//  rom_region - device-specific ROM region
21//-------------------------------------------------
22
23ROM_START( wordpro )
24   ROM_REGION(0x3000, "software", 0)
25   ROM_LOAD("wordpro.u3", 0x0000, 0x1000, CRC(c37ea780) SHA1(03f56711e08d88e7b523c0ef9c2a5af83ee7ad05))
26   ROM_LOAD("wordpro.u4", 0x1000, 0x1000, CRC(2e3a8c45) SHA1(a9d48d809f39a3478496a6d3ddd728bd0b4efc37))
27   ROM_LOAD("wordpro.u5", 0x2000, 0x1000, CRC(2a336802) SHA1(b4de50f943243f18a2bfabef354b76d77178c189))
28ROM_END
29
30const rom_entry *wordpro_device::device_rom_region() const
31{
32   return ROM_NAME( wordpro );
33}
34
35
36//**************************************************************************
37//  LIVE DEVICE
38//**************************************************************************
39
40//-------------------------------------------------
41//  wordpro_device - constructor
42//-------------------------------------------------
43
44wordpro_device::wordpro_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
45   device_t(mconfig, WORDPRO, "DSE VZ-300 WordPro", tag, owner, clock, "wordpro", __FILE__),
46   device_memexp_interface(mconfig, *this)
47{
48}
49
50//-------------------------------------------------
51//  device_start - device-specific startup
52//-------------------------------------------------
53
54void wordpro_device::device_start()
55{
56}
57
58//-------------------------------------------------
59//  device_reset - device-specific reset
60//-------------------------------------------------
61
62void wordpro_device::device_reset()
63{
64   m_slot->m_program->install_rom(0x6000, 0x67ff, memregion("software")->base());
65   m_slot->m_program->install_rom(0xd000, 0xffff, memregion("software")->base());
66}
Property changes on: trunk/src/emu/bus/vtech/memexp/wordpro.c
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/emu/bus/vtech/memexp/memory.h
r0r30875
1/***************************************************************************
2
3   VTech Laser/VZ Memory Expansions
4
5    license: MAME, GPL-2.0+
6    copyright-holders: Dirk Best
7
8***************************************************************************/
9
10#pragma once
11
12#ifndef __VTECH_MEMEXP_MEMORY__
13#define __VTECH_MEMEXP_MEMORY__
14
15#include "emu.h"
16#include "memexp.h"
17
18
19//**************************************************************************
20//  TYPE DEFINITIONS
21//**************************************************************************
22
23// ======================> laser110_16k_device
24
25class laser110_16k_device : public device_t, public device_memexp_interface
26{
27public:
28   // construction/destruction
29   laser110_16k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
30
31protected:
32   virtual void device_start();
33   virtual void device_reset();
34
35private:
36   dynamic_array<UINT8> m_ram;
37};
38
39// ======================> laser210_16k_device
40
41class laser210_16k_device : public device_t, public device_memexp_interface
42{
43public:
44   // construction/destruction
45   laser210_16k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
46
47protected:
48   virtual void device_start();
49   virtual void device_reset();
50
51private:
52   dynamic_array<UINT8> m_ram;
53};
54
55// ======================> laser310_16k_device
56
57class laser310_16k_device : public device_t, public device_memexp_interface
58{
59public:
60   // construction/destruction
61   laser310_16k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
62
63protected:
64   virtual void device_start();
65   virtual void device_reset();
66
67private:
68   dynamic_array<UINT8> m_ram;
69};
70
71// ======================> laser_64k_device
72
73class laser_64k_device : public device_t, public device_memexp_interface
74{
75public:
76   // construction/destruction
77   laser_64k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
78
79   DECLARE_WRITE8_MEMBER( bankswitch_w );
80
81protected:
82   virtual void device_start();
83   virtual void device_reset();
84
85private:
86   dynamic_array<UINT8> m_ram;
87};
88
89// device type definition
90extern const device_type LASER110_16K;
91extern const device_type LASER210_16K;
92extern const device_type LASER310_16K;
93extern const device_type LASER_64K;
94
95#endif // __VTECH_MEMEXP_MEMORY__
Property changes on: trunk/src/emu/bus/vtech/memexp/memory.h
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/emu/bus/vtech/ioexp/joystick.c
r0r30875
1/***************************************************************************
2
3   VTech Laser/VZ Joystick Interface
4
5    license: MAME, GPL-2.0+
6    copyright-holders: Dirk Best
7
8    VTech Laser JS 20
9    Dick Smith Electronics X-7315
10
11***************************************************************************/
12
13#include "joystick.h"
14
15
16//**************************************************************************
17//  DEVICE DEFINITIONS
18//**************************************************************************
19
20const device_type JOYSTICK_INTERFACE = &device_creator<joystick_interface_device>;
21
22//-------------------------------------------------
23//  input_ports - device-specific input ports
24//-------------------------------------------------
25
26static INPUT_PORTS_START( joystick )
27   PORT_START("joystick_0")
28   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP)    PORT_PLAYER(1)
29   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN)  PORT_PLAYER(1)
30   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT)  PORT_PLAYER(1)
31   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_PLAYER(1)
32   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON1)        PORT_PLAYER(1)
33   PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED)
34
35   PORT_START("joystick_0_arm")
36   PORT_BIT(0x0f, IP_ACTIVE_LOW, IPT_UNUSED)
37   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON2)        PORT_PLAYER(1)
38   PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED)
39
40   PORT_START("joystick_1")
41   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP)    PORT_PLAYER(2)
42   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN)  PORT_PLAYER(2)
43   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT)  PORT_PLAYER(2)
44   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_PLAYER(2)
45   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON1)        PORT_PLAYER(2)
46   PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED)
47
48   PORT_START("joystick_1_arm")
49   PORT_BIT(0x0f, IP_ACTIVE_LOW, IPT_UNUSED)
50   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON2)        PORT_PLAYER(2)
51   PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED)
52INPUT_PORTS_END
53
54ioport_constructor joystick_interface_device::device_input_ports() const
55{
56   return INPUT_PORTS_NAME( joystick );
57}
58
59
60//**************************************************************************
61//  LIVE DEVICE
62//**************************************************************************
63
64//-------------------------------------------------
65//  joystick_interface_device - constructor
66//-------------------------------------------------
67
68joystick_interface_device::joystick_interface_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
69   device_t(mconfig, JOYSTICK_INTERFACE, "Laser/VZ Joystick Interface", tag, owner, clock, "joystick", __FILE__),
70   device_ioexp_interface(mconfig, *this),
71   m_joy0(*this, "joystick_0"),
72   m_joy0_arm(*this, "joystick_0_arm"),
73   m_joy1(*this, "joystick_1"),
74   m_joy1_arm(*this, "joystick_1_arm")
75{
76}
77
78//-------------------------------------------------
79//  device_start - device-specific startup
80//-------------------------------------------------
81
82void joystick_interface_device::device_start()
83{
84}
85
86//-------------------------------------------------
87//  device_reset - device-specific reset
88//-------------------------------------------------
89
90void joystick_interface_device::device_reset()
91{
92   m_slot->m_io->install_read_handler(0x20, 0x2f, read8_delegate(FUNC(joystick_interface_device::joystick_r), this));
93}
94
95
96//**************************************************************************
97//  IMPLEMENTATION
98//**************************************************************************
99
100READ8_MEMBER( joystick_interface_device::joystick_r )
101{
102   UINT8 data = 0xff;
103
104   if (!BIT(offset, 0)) data &= m_joy0->read();
105   if (!BIT(offset, 1)) data &= m_joy0_arm->read();
106   if (!BIT(offset, 2)) data &= m_joy1->read();
107   if (!BIT(offset, 3)) data &= m_joy1_arm->read();
108
109   return data;
110}
Property changes on: trunk/src/emu/bus/vtech/ioexp/joystick.c
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/emu/bus/vtech/ioexp/carts.h
r0r30875
1/***************************************************************************
2
3   VTech Laser/VZ I/O Expansion Slot Devices
4
5***************************************************************************/
6
7#pragma once
8
9#ifndef __VTECH_IOEXP_CARTS_H__
10#define __VTECH_IOEXP_CARTS_H__
11
12#include "emu.h"
13
14#include "joystick.h"
15#include "printer.h"
16
17SLOT_INTERFACE_EXTERN( ioexp_slot_carts );
18
19#endif // __VTECH_IOEXP_CARTS_H__
Property changes on: trunk/src/emu/bus/vtech/ioexp/carts.h
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/emu/bus/vtech/ioexp/printer.c
r0r30875
1/***************************************************************************
2
3   VTech Laser/VZ Printer Interface
4
5    license: MAME, GPL-2.0+
6    copyright-holders: Dirk Best
7
8   VTech PI 20
9   Dick Smith Electronics X-7320
10
11***************************************************************************/
12
13#include "printer.h"
14
15
16//**************************************************************************
17//  DEVICE DEFINITIONS
18//**************************************************************************
19
20const device_type PRINTER_INTERFACE = &device_creator<printer_interface_device>;
21
22//-------------------------------------------------
23//  machine_config_additions - device-specific
24//  machine configurations
25//-------------------------------------------------
26
27static MACHINE_CONFIG_FRAGMENT( printer_interface )
28   MCFG_CENTRONICS_ADD("centronics", centronics_printers, "printer")
29   MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(printer_interface_device, busy_w))
30   MCFG_CENTRONICS_OUTPUT_LATCH_ADD("latch", "centronics")
31MACHINE_CONFIG_END
32
33machine_config_constructor printer_interface_device::device_mconfig_additions() const
34{
35   return MACHINE_CONFIG_NAME( printer_interface );
36}
37
38
39//**************************************************************************
40//  LIVE DEVICE
41//**************************************************************************
42
43//-------------------------------------------------
44//  printer_interface_device - constructor
45//-------------------------------------------------
46
47printer_interface_device::printer_interface_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
48   device_t(mconfig, PRINTER_INTERFACE, "Laser/VZ Printer Interface", tag, owner, clock, "printer", __FILE__),
49   device_ioexp_interface(mconfig, *this),
50   m_centronics(*this, "centronics"),
51   m_latch(*this, "latch"),
52   m_centronics_busy(0)
53{
54}
55
56//-------------------------------------------------
57//  device_start - device-specific startup
58//-------------------------------------------------
59
60void printer_interface_device::device_start()
61{
62}
63
64//-------------------------------------------------
65//  device_reset - device-specific reset
66//-------------------------------------------------
67
68void printer_interface_device::device_reset()
69{
70   m_slot->m_io->install_read_handler(0x00, 0x00, read8_delegate(FUNC(printer_interface_device::busy_r), this));
71   m_slot->m_io->install_write_handler(0x0d, 0x0d, write8_delegate(FUNC(printer_interface_device::strobe_w), this));
72   m_slot->m_io->install_write_handler(0x0e, 0x0e, write8_delegate(FUNC(output_latch_device::write), m_latch.target()));
73}
74
75
76//**************************************************************************
77//  IMPLEMENTATION
78//**************************************************************************
79
80WRITE_LINE_MEMBER( printer_interface_device::busy_w )
81{
82   m_centronics_busy = state;
83}
84
85READ8_MEMBER( printer_interface_device::busy_r )
86{
87   return 0xfe | m_centronics_busy;
88}
89
90WRITE8_MEMBER( printer_interface_device::strobe_w )
91{
92   m_centronics->write_strobe(1);
93   m_centronics->write_strobe(0);
94}
Property changes on: trunk/src/emu/bus/vtech/ioexp/printer.c
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/emu/bus/vtech/ioexp/ioexp.c
r0r30875
1/***************************************************************************
2
3   VTech Laser/VZ I/O Expansion Slot
4
5    license: MAME, GPL-2.0+
6    copyright-holders: Dirk Best
7
8   30-pin slot
9
10***************************************************************************/
11
12#include "ioexp.h"
13
14
15//**************************************************************************
16//  DEVICE DEFINITIONS
17//**************************************************************************
18
19const device_type IOEXP_SLOT = &device_creator<ioexp_slot_device>;
20
21
22//**************************************************************************
23//  SLOT DEVICE
24//**************************************************************************
25
26//-------------------------------------------------
27//  ioexp_slot_device - constructor
28//-------------------------------------------------
29
30ioexp_slot_device::ioexp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
31   device_t(mconfig, IOEXP_SLOT, "Peripheral Expansion Slot", tag, owner, clock, "ioexp_slot", __FILE__),
32   device_slot_interface(mconfig, *this),
33   m_io(NULL),
34   m_cart(NULL)
35{
36}
37
38//-------------------------------------------------
39//  ioexp_slot_device - destructor
40//-------------------------------------------------
41
42ioexp_slot_device::~ioexp_slot_device()
43{
44}
45
46//-------------------------------------------------
47//  device_start - device-specific startup
48//-------------------------------------------------
49
50void ioexp_slot_device::device_start()
51{
52}
53
54//-------------------------------------------------
55//  device_reset - device-specific reset
56//-------------------------------------------------
57
58void ioexp_slot_device::device_reset()
59{
60}
61
62//-------------------------------------------------
63//  set_io_space - set address space we are attached to
64//-------------------------------------------------
65
66void ioexp_slot_device::set_io_space(address_space *io)
67{
68   m_io = io;
69}
70
71
72//**************************************************************************
73//  CARTRIDGE INTERFACE
74//**************************************************************************
75
76//-------------------------------------------------
77//  device_ioexp_interface - constructor
78//-------------------------------------------------
79
80device_ioexp_interface::device_ioexp_interface(const machine_config &mconfig, device_t &device) :
81   device_slot_card_interface(mconfig, device)
82{
83   m_slot = dynamic_cast<ioexp_slot_device *>(device.owner());
84}
85
86//-------------------------------------------------
87//  ~device_ioexp_interface - destructor
88//-------------------------------------------------
89
90device_ioexp_interface::~device_ioexp_interface()
91{
92}
Property changes on: trunk/src/emu/bus/vtech/ioexp/ioexp.c
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/emu/bus/vtech/ioexp/joystick.h
r0r30875
1/***************************************************************************
2
3   VTech Laser Joystick Interface
4
5    license: MAME, GPL-2.0+
6    copyright-holders: Dirk Best
7
8    VTech Laser JS 20
9    Dick Smith Electronics X-7315
10
11***************************************************************************/
12
13#pragma once
14
15#ifndef __VTECH_IOEXP_JOYSTICK_H__
16#define __VTECH_IOEXP_JOYSTICK_H__
17
18#include "emu.h"
19#include "ioexp.h"
20
21
22//**************************************************************************
23//  TYPE DEFINITIONS
24//**************************************************************************
25
26// ======================> joystick_interface_device
27
28class joystick_interface_device : public device_t, public device_ioexp_interface
29{
30public:
31   // construction/destruction
32   joystick_interface_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
33
34   DECLARE_READ8_MEMBER( joystick_r );
35
36protected:
37   virtual ioport_constructor device_input_ports() const;
38   virtual void device_start();
39   virtual void device_reset();
40
41private:
42   required_ioport m_joy0;
43   required_ioport m_joy0_arm;
44   required_ioport m_joy1;
45   required_ioport m_joy1_arm;
46};
47
48// device type definition
49extern const device_type JOYSTICK_INTERFACE;
50
51#endif // __VTECH_IOEXP_JOYSTICK_H__
Property changes on: trunk/src/emu/bus/vtech/ioexp/joystick.h
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/emu/bus/vtech/ioexp/printer.h
r0r30875
1/***************************************************************************
2
3   VTech Laser/VZ Printer Interface
4
5    license: MAME, GPL-2.0+
6    copyright-holders: Dirk Best
7
8    Dick Smith Electronics X-7320
9
10***************************************************************************/
11
12#pragma once
13
14#ifndef __VTECH_IOEXP_PRINTER_H__
15#define __VTECH_IOEXP_PRINTER_H__
16
17#include "emu.h"
18#include "ioexp.h"
19#include "bus/centronics/ctronics.h"
20
21
22//**************************************************************************
23//  TYPE DEFINITIONS
24//**************************************************************************
25
26// ======================> printer_interface_device
27
28class printer_interface_device : public device_t, public device_ioexp_interface
29{
30public:
31   // construction/destruction
32   printer_interface_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
33
34   DECLARE_WRITE_LINE_MEMBER( busy_w );
35   DECLARE_READ8_MEMBER( busy_r );
36   DECLARE_WRITE8_MEMBER( strobe_w );
37
38protected:
39   virtual machine_config_constructor device_mconfig_additions() const;
40   virtual void device_start();
41   virtual void device_reset();
42
43private:
44   required_device<centronics_device> m_centronics;
45   required_device<output_latch_device> m_latch;
46
47   int m_centronics_busy;
48};
49
50// device type definition
51extern const device_type PRINTER_INTERFACE;
52
53#endif // __VTECH_IOEXP_PRINTER_H__
Property changes on: trunk/src/emu/bus/vtech/ioexp/printer.h
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/emu/bus/vtech/ioexp/ioexp.h
r0r30875
1/***************************************************************************
2
3   VTech Laser/VZ I/O Expansion Slot
4
5    license: MAME, GPL-2.0+
6    copyright-holders: Dirk Best
7
8   30-pin slot
9
10   15  GND             16  NC
11   14  /WR             17  NC
12   13  A3              18  NC
13   12  A6              19  +5VDC
14   11  A2              20  NC
15   10  A5              21  D4
16    9  D0              22  D5
17    8  D2              23  D7
18    7  D6              24  D1
19    6  D3              25  /RD
20    5  /IORQ           26  A1
21    4  +5VDC           27  A4
22    3  NC              28  A0
23    2  NC              29  A7
24    1  NC              30  NC
25
26***************************************************************************/
27
28#pragma once
29
30#ifndef __VTECH_IOEXP_H__
31#define __VTECH_IOEXP_H__
32
33#include "emu.h"
34
35
36//**************************************************************************
37//  INTERFACE CONFIGURATION MACROS
38//**************************************************************************
39
40#define MCFG_IOEXP_SLOT_ADD(_tag) \
41   MCFG_DEVICE_ADD(_tag, IOEXP_SLOT, 0) \
42   MCFG_DEVICE_SLOT_INTERFACE(ioexp_slot_carts, NULL, false)
43
44
45//**************************************************************************
46//  TYPE DEFINITIONS
47//**************************************************************************
48
49class device_ioexp_interface;
50
51class ioexp_slot_device : public device_t, public device_slot_interface
52{
53public:
54   // construction/destruction
55   ioexp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
56   virtual ~ioexp_slot_device();
57
58   void set_io_space(address_space *io);
59
60   address_space *m_io;
61
62protected:
63   // device-level overrides
64   virtual void device_start();
65   virtual void device_reset();
66
67   device_ioexp_interface *m_cart;
68};
69
70// class representing interface-specific live ioexp device
71class device_ioexp_interface : public device_slot_card_interface
72{
73public:
74   // construction/destruction
75   device_ioexp_interface(const machine_config &mconfig, device_t &device);
76   virtual ~device_ioexp_interface();
77
78protected:
79   ioexp_slot_device *m_slot;
80};
81
82// device type definition
83extern const device_type IOEXP_SLOT;
84
85// include here so drivers don't need to
86#include "carts.h"
87
88#endif // __VTECH_IOEXP_H__
Property changes on: trunk/src/emu/bus/vtech/ioexp/ioexp.h
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/emu/bus/vtech/ioexp/carts.c
r0r30875
1/***************************************************************************
2
3   VTech Laser/VZ I/O Expansion Slot Devices
4
5***************************************************************************/
6
7#include "carts.h"
8
9SLOT_INTERFACE_START( ioexp_slot_carts )
10   SLOT_INTERFACE("joystick", JOYSTICK_INTERFACE)
11   SLOT_INTERFACE("printer", PRINTER_INTERFACE)
12SLOT_INTERFACE_END
Property changes on: trunk/src/emu/bus/vtech/ioexp/carts.c
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/emu/bus/bus.mak
r30874r30875
11651165BUSOBJS += $(BUSOBJ)/ql/miracle_hd.o
11661166BUSOBJS += $(BUSOBJ)/ql/std.o
11671167endif
1168
1169#-------------------------------------------------
1170#
1171#@src/emu/bus/vtech/memexp/memexp.h,BUSES += VTECH_MEMEXP
1172#-------------------------------------------------
1173
1174ifneq ($(filter VTECH_MEMEXP,$(BUSES)),)
1175OBJDIRS += $(BUSOBJ)/vtech/memexp
1176BUSOBJS += $(BUSOBJ)/vtech/memexp/memexp.o
1177BUSOBJS += $(BUSOBJ)/vtech/memexp/carts.o
1178BUSOBJS += $(BUSOBJ)/vtech/memexp/floppy.o
1179BUSOBJS += $(BUSOBJ)/vtech/memexp/memory.o
1180BUSOBJS += $(BUSOBJ)/vtech/memexp/rs232.o
1181BUSOBJS += $(BUSOBJ)/vtech/memexp/wordpro.o
1182endif
1183
1184#-------------------------------------------------
1185#
1186#@src/emu/bus/vtech/ioexp/ioexp.h,BUSES += VTECH_IOEXP
1187#-------------------------------------------------
1188
1189ifneq ($(filter VTECH_IOEXP,$(BUSES)),)
1190OBJDIRS += $(BUSOBJ)/vtech/ioexp
1191BUSOBJS += $(BUSOBJ)/vtech/ioexp/ioexp.o
1192BUSOBJS += $(BUSOBJ)/vtech/ioexp/carts.o
1193BUSOBJS += $(BUSOBJ)/vtech/ioexp/joystick.o
1194BUSOBJS += $(BUSOBJ)/vtech/ioexp/printer.o
1195endif
trunk/src/lib/formats/vtech1_dsk.c
r30874r30875
2828      vtech1_dsk_identify,
2929      vtech1_dsk_construct,
3030      NULL,
31      NULL
31      HEADS([1])
32      TRACKS([40])
33      SECTORS([16])
34      SECTOR_LENGTH([154])
35      FIRST_SECTOR_ID([0])
3236   )
3337LEGACY_FLOPPY_OPTIONS_END0
trunk/src/mess/mess.lst
r30874r30875
12111211vz2000
12121212crvisio2
12131213manager
1214
1215// Video Technology Laser Generation 1 machines
12141216laser110  // 1983 Laser 110
1215las110de  // 1983 Sanyo Laser 110 (Germany)
1216laser200  // 1983 Laser 200 (color version of 110)
1217//  vz200de   // 1983 VZ-200 (Germany)
1218fellow  // 1983 Salora Fellow (Finland)
1219tx8000  // 1983 Texet TX-8000 (U.K.)
1220laser210  // 1984 Laser 210 (200 with more memory)
1221las210de  // 1984 Sanyo Laser 210 (Germany)
1222vz200    // 1984 Dick Smith Electronics VZ-200
1223laser310  // 1984 Laser 310 (210 with diff. keyboard and RAM)
1217laser200  // 1983 Laser 200
1218vz200de   // 1983 VZ-200 (Germany)
1219fellow    // 1983 Salora Fellow
1220tx8000    // 1983 Texet TX-8000
1221laser210  // 1984 Laser 210
1222vz200     // 1984 Dick Smith Electronics VZ-200
1223laser310  // 1984 Laser 310
12241224laser310h // 1984 Laser 310 with SHRG mod
1225vz300    // 1984 Dick Smith Electronics VZ-300
1225vz300     // 1984 Dick Smith Electronics VZ-300
1226
1227// Video Technology Laser Generation 2 machines
12261228laser350  // 1984? Laser 350
12271229laser500  // 1984? Laser 500
12281230laser700  // 1984? Laser 700
1231
12291232socrates  // 1988 Socrates Educational Video System (USA)
12301233socratfc  // 1988 Socrates SAITOUT (French Canada)
1231profweis  // 1988 (Yeno) Proffesor Weiss-Alles (Germany)
1234profweis  // 1988 (Yeno) Professor Weiss-Alles (Germany)
12321235gl8008cx  // 1999 Genius Leader 8008 CX (Germany)
12331236bs9009cx  // 1999 BrainStation 9009 CXL (Germany)
12341237iq128_fr // 1997 Genius PC (France)
trunk/src/mess/drivers/vtech1.c
r30874r30875
1/*****************************************************************************
1/***************************************************************************
22
33    Video Technology Laser 110
4      Sanyo Laser 110
54    Video Technology Laser 200
65      Salora Fellow
7      Texet TX-8000
6      Texet TX-8000 (?)
87      Video Technology VZ-200
98    Video Technology Laser 210
109      Dick Smith Electronics VZ-200
11      Sanyo Laser 210
1210    Video Technology Laser 310
1311      Dick Smith Electronics VZ-300
1412
r30874r30875
2422    - Davide Moretti for the detailed description of the colors
2523    - Leslie Milburn
2624
27Memory maps:
28
29    Laser 110/200
30        0000-1FFF 8K ROM 0
31        2000-3FFF 8K ROM 1
32        4000-5FFF 8K DOS ROM or other cartridges (optional)
33        6000-67FF 2K reserved for rom cartridges
34        6800-6FFF 2K memory mapped I/O
35                    R: keyboard
36                    W: cassette I/O, speaker, VDP control
37        7000-77FF 2K video RAM
38        7800-7FFF 2K internal user RAM
39        8800-C7FF 16K memory expansion
40        8000-BFFF 64K memory expansion, first bank
41        C000-FFFF 64K memory expansion, other banks
42
43    Laser 210
44        0000-1FFF 8K ROM 0
45        2000-3FFF 8K ROM 1
46        4000-5FFF 8K DOS ROM or other cartridges (optional)
47        6000-67FF 2K reserved for rom cartridges
48        6800-6FFF 2K memory mapped I/O
49                    R: keyboard
50                    W: cassette I/O, speaker, VDP control
51        7000-77FF 2K video RAM
52        7800-8FFF 6K internal user RAM (3x2K: U2, U3, U4)
53        9000-CFFF 16K memory expansion
54        8000-BFFF 64K memory expansion, first bank
55        C000-FFFF 64K memory expansion, other banks
56
57    Laser 310
58        0000-3FFF 16K ROM
59        4000-5FFF 8K DOS ROM or other cartridges (optional)
60        6000-67FF 2K reserved for rom cartridges
61        6800-6FFF 2K memory mapped I/O
62                    R: keyboard
63                    W: cassette I/O, speaker, VDP control
64        7000-77FF 2K video RAM
65        7800-B7FF 16K internal user RAM
66        B800-F7FF 16K memory expansion
67        8000-BFFF 64K memory expansion, first bank
68        C000-FFFF 64K memory expansion, other banks
69
70
71   Memory expansions available for the Laser/VZ computers:
72
73   - a 16kb expansion without banking
74   - a 64kb expansion where the first bank is fixed and the other 3 are
75     banked in as needed
76   - a banked memory expansion similar to the 64kb one, that the user could
77     fill themselves with memory up to 4MB total.
78
79   They are externally connected devices. The 16kb extension is different
80   between Laser 110/210/310 computers, though it could be relativly
81   easily modified to work on another model.
82
83
8425Todo:
8526
8627    - Figure out which machines were shipped with which ROM version
8728      where not known (currently only a guess)
8829    - Lightpen support
89    - Rewrite floppy and move to its own file
90    - Add support for the wordprocessor cartridge
30    - Rewrite floppy
9131
92Notes:
32***************************************************************************/
9333
94    - DOS ROM: CRC(b6ed6084) SHA1(59d1cbcfa6c5e1906a32704fbf0d9670f0d1fd8b)
95
96
97******************************************************************************/
98
9934#include "emu.h"
10035#include "formats/imageutl.h"
10136#include "cpu/z80/z80.h"
10237#include "video/mc6847.h"
103#include "bus/centronics/ctronics.h"
38#include "bus/vtech/ioexp/ioexp.h"
39#include "bus/vtech/memexp/memexp.h"
10440#include "sound/wave.h"
10541#include "sound/speaker.h"
106#include "imagedev/cartslot.h"
107#include "imagedev/flopdrv.h"
10842#include "imagedev/snapquik.h"
10943#include "imagedev/cassette.h"
110#include "machine/ram.h"
11144#include "formats/vt_cas.h"
112#include "formats/vtech1_dsk.h"
11345
46
11447/***************************************************************************
11548    CONSTANTS & MACROS
11649***************************************************************************/
11750
11851#define LOG_VTECH1_LATCH 0
119#define LOG_VTECH1_FDC   0
12052
12153#define VTECH1_CLK        3579500
12254#define VZ300_XTAL1_CLK   XTAL_17_73447MHz
12355
124#define VZ_BASIC 0xf0
125#define VZ_MCODE 0xf1
12656
127#define TRKSIZE_VZ  0x9a0   /* arbitrary (actually from analyzing format) */
128#define TRKSIZE_FM  3172    /* size of a standard FM mode track */
129
130#define PHI0(n) (((n)>>0)&1)
131#define PHI1(n) (((n)>>1)&1)
132#define PHI2(n) (((n)>>2)&1)
133#define PHI3(n) (((n)>>3)&1)
134
135
13657/***************************************************************************
13758    TYPE DEFINITIONS
13859***************************************************************************/
r30874r30875
14061class vtech1_state : public driver_device
14162{
14263public:
143   vtech1_state(const machine_config &mconfig, device_type type, const char *tag)
144      : driver_device(mconfig, type, tag),
64   vtech1_state(const machine_config &mconfig, device_type type, const char *tag) :
65      driver_device(mconfig, type, tag),
66      m_videoram(*this, "videoram"),
67      m_maincpu(*this, "maincpu"),
14568      m_mc6847(*this, "mc6847"),
14669      m_speaker(*this, "speaker"),
14770      m_cassette(*this, "cassette"),
148      m_videoram(*this, "videoram"),
149      m_maincpu(*this, "maincpu"),
150      m_ram(*this, RAM_TAG),
151      m_centronics(*this, "centronics")
71      m_ioexp(*this, "io"),
72      m_memexp(*this, "mem")
15273   {
15374   }
15475
155   /* devices */
156   required_device<mc6847_base_device> m_mc6847;
157   optional_device<speaker_sound_device> m_speaker;
158   optional_device<cassette_image_device> m_cassette;
76   DECLARE_DRIVER_INIT(vtech1);
77   DECLARE_DRIVER_INIT(vtech1h);
15978
160   UINT8 *m_ram_pointer;
161   UINT32 m_ram_size;
162   required_shared_ptr<UINT8> m_videoram;
163
164   /* floppy */
165   int m_drive;
166   UINT8 m_fdc_track_x2[2];
167   UINT8 m_fdc_wrprot[2];
168   UINT8 m_fdc_status;
169   UINT8 m_fdc_data[TRKSIZE_FM];
170   int m_data;
171   int m_fdc_edge;
172   int m_fdc_bits;
173   int m_fdc_start;
174   int m_fdc_write;
175   int m_fdc_offs;
176   int m_fdc_latch;
177   int m_centronics_busy;
178   DECLARE_WRITE_LINE_MEMBER(write_centronics_busy);
179   DECLARE_READ8_MEMBER(vtech1_fdc_r);
180   DECLARE_WRITE8_MEMBER(vtech1_fdc_w);
181   DECLARE_READ8_MEMBER(vtech1_serial_r);
182   DECLARE_WRITE8_MEMBER(vtech1_serial_w);
18379   DECLARE_READ8_MEMBER(vtech1_lightpen_r);
184   DECLARE_READ8_MEMBER(vtech1_joystick_r);
18580   DECLARE_READ8_MEMBER(vtech1_keyboard_r);
18681   DECLARE_WRITE8_MEMBER(vtech1_latch_w);
187   DECLARE_WRITE8_MEMBER(vtech1_memory_bank_w);
82
18883   DECLARE_WRITE8_MEMBER(vtech1_video_bank_w);
189   DECLARE_DRIVER_INIT(vtech1h);
190   DECLARE_DRIVER_INIT(vtech1);
191   DECLARE_READ8_MEMBER(vtech1_printer_r);
192   DECLARE_WRITE8_MEMBER(vtech1_strobe_w);
19384   DECLARE_READ8_MEMBER(mc6847_videoram_r);
85
19486   DECLARE_SNAPSHOT_LOAD_MEMBER( vtech1 );
195   void vtech1_get_track();
196   void vtech1_put_track();
87
88private:
89   static const UINT8 VZ_BASIC = 0xf0;
90   static const UINT8 VZ_MCODE = 0xf1;
91
92   required_shared_ptr<UINT8> m_videoram;
93
19794   required_device<cpu_device> m_maincpu;
198   required_device<ram_device> m_ram;
199   required_device<centronics_device> m_centronics;
95   required_device<mc6847_base_device> m_mc6847;
96   required_device<speaker_sound_device> m_speaker;
97   required_device<cassette_image_device> m_cassette;
98   required_device<ioexp_slot_device> m_ioexp;
99   required_device<memexp_slot_device> m_memexp;
200100};
201101
202102
r30874r30875
207107SNAPSHOT_LOAD_MEMBER( vtech1_state, vtech1 )
208108{
209109   address_space &space = m_maincpu->space(AS_PROGRAM);
210   UINT8 i, header[24];
211   UINT16 start, end, size;
110   UINT8 header[24];
212111   char pgmname[18];
213112
214   /* get the header */
215   image.fread( &header, sizeof(header));
216   for (i = 0; i < 16; i++) pgmname[i] = header[i+4];
113   // get the header
114   image.fread(&header, sizeof(header));
115
116   // get image name
117   for (int i = 0; i < 16; i++)
118      pgmname[i] = header[i+4];
217119   pgmname[16] = '\0';
218120
219   /* get start and end addresses */
220   start = pick_integer_le(header, 22, 2);
221   end = start + snapshot_size - sizeof(header);
222   size = end - start;
121   // get start and end addresses
122   UINT16 start = pick_integer_le(header, 22, 2);
123   UINT16 end = start + snapshot_size - sizeof(header);
124   UINT16 size = end - start;
223125
224   /* check if we have enough ram */
225   if (m_ram_size < size)
126   // write it to ram
127   UINT8 *ptr = (UINT8 *)image.ptr() + sizeof(header);
128
129   for (UINT16 addr = start; addr <= end; addr++, ptr++)
226130   {
227      char message[256];
228      snprintf(message, ARRAY_LENGTH(message), "SNAPLOAD: %s\nInsufficient RAM - need %04X",pgmname,size);
229      image.seterror(IMAGE_ERROR_INVALIDIMAGE, message);
230      image.message("SNAPLOAD: %s\nInsufficient RAM - need %04X",pgmname,size);
231      return IMAGE_INIT_FAIL;
232   }
131      UINT8 to_write = *ptr;
132      space.write_byte(addr, to_write);
233133
234   /* write it to ram */
235   image.fread( &m_ram_pointer[start - 0x7800], size);
134      // verify
135      if (space.read_byte(addr) != to_write)
136      {
137         image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Insufficient RAM to load snapshot");
138         image.message("Insufficient RAM to load snapshot (%d bytes needed) [%s]", size, pgmname);
236139
237   /* patch variables depending on snapshot type */
140         return IMAGE_INIT_FAIL;
141      }
142   }
143
144   // patch variables depending on snapshot type
238145   switch (header[21])
239146   {
240   case VZ_BASIC:      /* 0xF0 */
147   case VZ_BASIC:
241148      space.write_byte(0x78a4, start % 256); /* start of basic program */
242149      space.write_byte(0x78a5, start / 256);
243150      space.write_byte(0x78f9, end % 256); /* end of basic program */
r30874r30875
246153      space.write_byte(0x78fc, end / 256);
247154      space.write_byte(0x78fd, end % 256); /* start free mem, end variable table */
248155      space.write_byte(0x78fe, end / 256);
249      image.message(" %s (B)\nsize=%04X : start=%04X : end=%04X",pgmname,size,start,end);
156      image.message(" %s (B)\nsize=%04X : start=%04X : end=%04X", pgmname, size, start, end);
250157      break;
251158
252   case VZ_MCODE:      /* 0xF1 */
159   case VZ_MCODE:
253160      space.write_byte(0x788e, start % 256); /* usr subroutine address */
254161      space.write_byte(0x788f, start / 256);
255      image.message(" %s (M)\nsize=%04X : start=%04X : end=%04X",pgmname,size,start,end);
162      image.message(" %s (M)\nsize=%04X : start=%04X : end=%04X", pgmname, size, start, end);
256163      m_maincpu->set_pc(start);              /* start program */
257164      break;
258165
r30874r30875
267174
268175
269176/***************************************************************************
270    FLOPPY DRIVE
271***************************************************************************/
272static void vtech1_load_proc(device_image_interface &image)
273{
274   vtech1_state *vtech1 = image.device().machine().driver_data<vtech1_state>();
275   int id = floppy_get_drive(&image.device());
276
277   if (!image.is_readonly())
278      vtech1->m_fdc_wrprot[id] = 0x00;
279   else
280      vtech1->m_fdc_wrprot[id] = 0x80;
281}
282
283void vtech1_state::vtech1_get_track()
284{
285   device_image_interface *image = dynamic_cast<device_image_interface *>(floppy_get_device(machine(),m_drive));
286
287   /* drive selected or and image file ok? */
288   if (m_drive >= 0 && image->exists())
289   {
290      int size, offs;
291      size = TRKSIZE_VZ;
292      offs = TRKSIZE_VZ * m_fdc_track_x2[m_drive]/2;
293      image->fseek(offs, SEEK_SET);
294         // some disks have slightly larger header, make sure we capture the checksum at the end of the track
295      size = image->fread(m_fdc_data, size+4);
296      if (LOG_VTECH1_FDC)
297         logerror("get track @$%05x $%04x bytes\n", offs, size);
298   }
299   m_fdc_offs = 0;
300   m_fdc_write = 0;
301}
302
303void vtech1_state::vtech1_put_track()
304{
305   /* drive selected and image file ok? */
306   if (m_drive >= 0 && floppy_get_device(machine(),m_drive) != NULL)
307   {
308      int size, offs;
309      device_image_interface *image = dynamic_cast<device_image_interface *>(floppy_get_device(machine(),m_drive));
310      offs = TRKSIZE_VZ * m_fdc_track_x2[m_drive]/2;
311      image->fseek(offs + m_fdc_start, SEEK_SET);
312      size = image->fwrite(&m_fdc_data[m_fdc_start], m_fdc_write);
313      if (LOG_VTECH1_FDC)
314         logerror("put track @$%05X+$%X $%04X/$%04X bytes\n", offs, m_fdc_start, size, m_fdc_write);
315   }
316}
317
318READ8_MEMBER(vtech1_state::vtech1_fdc_r)
319{
320   int data = 0xff;
321
322   switch (offset)
323   {
324   case 1: /* data (read-only) */
325      if (m_fdc_bits > 0)
326      {
327         if( m_fdc_status & 0x80 )
328            m_fdc_bits--;
329         data = (m_data >> m_fdc_bits) & 0xff;
330         if (LOG_VTECH1_FDC) {
331            logerror("vtech1_fdc_r bits %d%d%d%d%d%d%d%d\n",
332               (data>>7)&1,(data>>6)&1,(data>>5)&1,(data>>4)&1,
333               (data>>3)&1,(data>>2)&1,(data>>1)&1,(data>>0)&1 );
334         }
335      }
336      if (m_fdc_bits == 0)
337      {
338         m_data = m_fdc_data[m_fdc_offs];
339         if (LOG_VTECH1_FDC)
340            logerror("vtech1_fdc_r %d : data ($%04X) $%02X\n", offset, m_fdc_offs, m_data);
341         if(m_fdc_status & 0x80)
342         {
343            m_fdc_bits = 8;
344            m_fdc_offs = (m_fdc_offs + 1) % TRKSIZE_FM;
345         }
346         m_fdc_status &= ~0x80;
347      }
348      break;
349   case 2: /* polling (read-only) */
350      /* fake */
351      if (m_drive >= 0)
352         m_fdc_status |= 0x80;
353      data = m_fdc_status;
354      break;
355   case 3: /* write protect status (read-only) */
356      if (m_drive >= 0)
357         data = m_fdc_wrprot[m_drive];
358      if (LOG_VTECH1_FDC)
359         logerror("vtech1_fdc_r %d : write_protect $%02X\n", offset, data);
360      break;
361   }
362   return data;
363}
364
365WRITE8_MEMBER(vtech1_state::vtech1_fdc_w)
366{
367   int drive;
368
369   switch (offset)
370   {
371   case 0: /* latch (write-only) */
372      drive = (data & 0x10) ? 0 : (data & 0x80) ? 1 : -1;
373      if (drive != m_drive)
374      {
375         m_drive = drive;
376         if (m_drive >= 0)
377            vtech1_get_track();
378      }
379      if (m_drive >= 0)
380      {
381         if ((PHI0(data) && !(PHI1(data) || PHI2(data) || PHI3(data)) && PHI1(m_fdc_latch)) ||
382            (PHI1(data) && !(PHI0(data) || PHI2(data) || PHI3(data)) && PHI2(m_fdc_latch)) ||
383            (PHI2(data) && !(PHI0(data) || PHI1(data) || PHI3(data)) && PHI3(m_fdc_latch)) ||
384            (PHI3(data) && !(PHI0(data) || PHI1(data) || PHI2(data)) && PHI0(m_fdc_latch)))
385         {
386            if (m_fdc_track_x2[m_drive] > 0)
387               m_fdc_track_x2[m_drive]--;
388            if (LOG_VTECH1_FDC)
389               logerror("vtech1_fdc_w(%d) $%02X drive %d: stepout track #%2d.%d\n", offset, data, m_drive, m_fdc_track_x2[m_drive]/2,5*(m_fdc_track_x2[m_drive]&1));
390            if ((m_fdc_track_x2[m_drive] & 1) == 0)
391               vtech1_get_track();
392         }
393         else
394         if ((PHI0(data) && !(PHI1(data) || PHI2(data) || PHI3(data)) && PHI3(m_fdc_latch)) ||
395            (PHI1(data) && !(PHI0(data) || PHI2(data) || PHI3(data)) && PHI0(m_fdc_latch)) ||
396            (PHI2(data) && !(PHI0(data) || PHI1(data) || PHI3(data)) && PHI1(m_fdc_latch)) ||
397            (PHI3(data) && !(PHI0(data) || PHI1(data) || PHI2(data)) && PHI2(m_fdc_latch)))
398         {
399            if (m_fdc_track_x2[m_drive] < 2*40)
400               m_fdc_track_x2[m_drive]++;
401            if (LOG_VTECH1_FDC)
402               logerror("vtech1_fdc_w(%d) $%02X drive %d: stepin track #%2d.%d\n", offset, data, m_drive, m_fdc_track_x2[m_drive]/2,5*(m_fdc_track_x2[m_drive]&1));
403            if ((m_fdc_track_x2[m_drive] & 1) == 0)
404               vtech1_get_track();
405         }
406         if ((data & 0x40) == 0)
407         {
408            m_data <<= 1;
409            if ((m_fdc_latch ^ data) & 0x20)
410               m_data |= 1;
411            if ((m_fdc_edge ^= 1) == 0)
412            {
413               m_fdc_bits--;
414
415               if (m_fdc_bits == 0)
416               {
417                  UINT8 value = 0;
418                  m_data &= 0xffff;
419                  if (m_data & 0x4000 ) value |= 0x80;
420                  if (m_data & 0x1000 ) value |= 0x40;
421                  if (m_data & 0x0400 ) value |= 0x20;
422                  if (m_data & 0x0100 ) value |= 0x10;
423                  if (m_data & 0x0040 ) value |= 0x08;
424                  if (m_data & 0x0010 ) value |= 0x04;
425                  if (m_data & 0x0004 ) value |= 0x02;
426                  if (m_data & 0x0001 ) value |= 0x01;
427                  if (LOG_VTECH1_FDC)
428                     logerror("vtech1_fdc_w(%d) data($%04X) $%02X <- $%02X ($%04X)\n", offset, m_fdc_offs, m_fdc_data[m_fdc_offs], value, m_data);
429                  m_fdc_data[m_fdc_offs] = value;
430                  m_fdc_offs = (m_fdc_offs + 1) % TRKSIZE_FM;
431                  m_fdc_write++;
432                  m_fdc_bits = 8;
433               }
434            }
435         }
436         /* change of write signal? */
437         if ((m_fdc_latch ^ data) & 0x40)
438         {
439            /* falling edge? */
440            if (m_fdc_latch & 0x40)
441            {
442               m_fdc_start = m_fdc_offs;
443               m_fdc_edge = 0;
444            }
445            else
446            {
447               /* data written to track before? */
448               if (m_fdc_write)
449                  vtech1_put_track();
450            }
451            m_fdc_bits = 8;
452            m_fdc_write = 0;
453         }
454      }
455      m_fdc_latch = data;
456      break;
457   }
458}
459
460static const floppy_interface vtech1_floppy_interface =
461{
462   FLOPPY_STANDARD_5_25_DSHD,
463   LEGACY_FLOPPY_OPTIONS_NAME(vtech1_only),
464   NULL
465};
466
467/***************************************************************************
468    PRINTER
469***************************************************************************/
470
471WRITE_LINE_MEMBER(vtech1_state::write_centronics_busy)
472{
473   m_centronics_busy = state;
474}
475
476READ8_MEMBER(vtech1_state::vtech1_printer_r)
477{
478   return 0xfe | m_centronics_busy;
479}
480
481/* TODO: figure out how this really works */
482WRITE8_MEMBER(vtech1_state::vtech1_strobe_w)
483{
484   m_centronics->write_strobe(TRUE);
485   m_centronics->write_strobe(FALSE);
486}
487
488
489/***************************************************************************
490    RS232 SERIAL
491***************************************************************************/
492
493READ8_MEMBER(vtech1_state::vtech1_serial_r)
494{
495   logerror("vtech1_serial_r offset $%02x\n", offset);
496   return 0xff;
497}
498
499WRITE8_MEMBER(vtech1_state::vtech1_serial_w)
500{
501   logerror("vtech1_serial_w $%02x, offset %02x\n", data, offset);
502}
503
504
505/***************************************************************************
506177    INPUTS
507178***************************************************************************/
508179
509READ8_MEMBER(vtech1_state::vtech1_lightpen_r)
180READ8_MEMBER( vtech1_state::vtech1_lightpen_r )
510181{
511182   logerror("vtech1_lightpen_r(%d)\n", offset);
512183   return 0xff;
513184}
514185
515READ8_MEMBER(vtech1_state::vtech1_joystick_r)
186READ8_MEMBER( vtech1_state::vtech1_keyboard_r )
516187{
517   int result = 0xff;
518
519   if (!BIT(offset, 0)) result &= ioport("joystick_0")->read();
520   if (!BIT(offset, 1)) result &= ioport("joystick_0_arm")->read();
521   if (!BIT(offset, 2)) result &= ioport("joystick_1")->read();
522   if (!BIT(offset, 3)) result &= ioport("joystick_1_arm")->read();
523
524   return result;
525}
526
527READ8_MEMBER(vtech1_state::vtech1_keyboard_r)
528{
529188   UINT8 result = 0x3f;
530189
531   /* bit 0 to 5, keyboard input */
190   // bit 0 to 5, keyboard input
532191   if (!BIT(offset, 0)) result &= ioport("keyboard_0")->read();
533192   if (!BIT(offset, 1)) result &= ioport("keyboard_1")->read();
534193   if (!BIT(offset, 2)) result &= ioport("keyboard_2")->read();
r30874r30875
538197   if (!BIT(offset, 6)) result &= ioport("keyboard_6")->read();
539198   if (!BIT(offset, 7)) result &= ioport("keyboard_7")->read();
540199
541   /* bit 6, cassette input */
200   // bit 6, cassette input
542201   result |= ((m_cassette->input()) > 0 ? 1 : 0) << 6;
543202
544   /* bit 7, field sync */
203   // bit 7, field sync
545204   result |= m_mc6847->fs_r() << 7;
546205
547206   return result;
r30874r30875
552211    I/O LATCH
553212***************************************************************************/
554213
555WRITE8_MEMBER(vtech1_state::vtech1_latch_w)
214WRITE8_MEMBER( vtech1_state::vtech1_latch_w )
556215{
557216   if (LOG_VTECH1_LATCH)
558217      logerror("vtech1_latch_w $%02X\n", data);
559218
560   /* bit 1, SHRG mod (if installed) */
219   // bit 1, SHRG mod (if installed)
561220   if (m_videoram.bytes() == 0x2000)
562221   {
563222      m_mc6847->gm0_w(BIT(data, 1));
564223      m_mc6847->gm2_w(BIT(data, 1));
565224   }
566225
567   /* bit 2, cassette out */
226   // bit 2, cassette out
568227   m_cassette->output( BIT(data, 2) ? +1.0 : -1.0);
569228
570   /* bit 3 and 4, vdc mode control lines */
229   // bit 3 and 4, vdc mode control lines
571230   m_mc6847->ag_w(BIT(data, 3));
572231   m_mc6847->css_w(BIT(data, 4));
573232
574   /* bit 0 and 5, speaker */
233   // bit 0 and 5, speaker
575234   m_speaker->level_w((BIT(data, 5) << 1) | BIT(data, 0));
576235}
577236
r30874r30875
580239    MEMORY BANKING
581240***************************************************************************/
582241
583WRITE8_MEMBER(vtech1_state::vtech1_memory_bank_w)
242WRITE8_MEMBER( vtech1_state::vtech1_video_bank_w )
584243{
585   logerror("vtech1_memory_bank_w $%02X\n", data);
586
587   if (data >= 1)
588      if ((data <= 3 && m_ram_size == 66*1024) || (m_ram_size == 4098*1024))
589         membank("bank3")->set_entry(data - 1);
590}
591
592WRITE8_MEMBER(vtech1_state::vtech1_video_bank_w)
593{
594   logerror("vtech1_video_bank_w $%02X\n", data);
595244   membank("bank4")->set_entry(data & 0x03);
596245}
597246
r30874r30875
600249    VIDEO EMULATION
601250***************************************************************************/
602251
603READ8_MEMBER(vtech1_state::mc6847_videoram_r)
252READ8_MEMBER( vtech1_state::mc6847_videoram_r )
604253{
605254   if (offset == ~0) return 0xff;
255
606256   m_mc6847->inv_w(BIT(m_videoram[offset], 6));
607257   m_mc6847->as_w(BIT(m_videoram[offset], 7));
608258
r30874r30875
614264    DRIVER INIT
615265***************************************************************************/
616266
617DRIVER_INIT_MEMBER(vtech1_state,vtech1)
267DRIVER_INIT_MEMBER( vtech1_state, vtech1 )
618268{
619   address_space &prg = m_maincpu->space(AS_PROGRAM);
620   int id;
621
622   /* ram */
623   m_ram_pointer = m_ram->pointer();
624   m_ram_size = m_ram->size();
625
626   /* setup memory banking */
627   membank("bank1")->set_base(m_ram_pointer);
628
629   /* 16k memory expansion? */
630   if (m_ram_size == 18*1024 || m_ram_size == 22*1024 || m_ram_size == 32*1024)
631   {
632      offs_t base = 0x7800 + (m_ram_size - 0x4000);
633      prg.install_readwrite_bank(base, base + 0x3fff, "bank2");
634      membank("bank2")->set_base(m_ram_pointer + base - 0x7800);
635   }
636
637   /* 64k expansion? */
638   if (m_ram_size >= 66*1024)
639   {
640      /* install fixed first bank */
641      prg.install_readwrite_bank(0x8000, 0xbfff, "bank2");
642      membank("bank2")->set_base(m_ram_pointer + 0x800);
643
644      /* install the others, dynamically banked in */
645      prg.install_readwrite_bank(0xc000, 0xffff, "bank3");
646      membank("bank3")->configure_entries(0, (m_ram_size - 0x4800) / 0x4000, m_ram_pointer + 0x4800, 0x4000);
647      membank("bank3")->set_entry(0);
648   }
649
650   /* initialize floppy */
651   m_drive = -1;
652   m_fdc_track_x2[0] = 80;
653   m_fdc_track_x2[1] = 80;
654   m_fdc_wrprot[0] = 0x80;
655   m_fdc_wrprot[1] = 0x80;
656   m_fdc_status = 0;
657   m_fdc_edge = 0;
658   m_fdc_bits = 8;
659   m_fdc_start = 0;
660   m_fdc_write = 0;
661   m_fdc_offs = 0;
662   m_fdc_latch = 0;
663
664   for(id=0;id<2;id++)
665   {
666      floppy_get_device(machine(), id)->floppy_install_load_proc(vtech1_load_proc);
667   }
269   // setup expansion slots
270   m_ioexp->set_io_space(&m_maincpu->space(AS_IO));
271   m_memexp->set_program_space(&m_maincpu->space(AS_PROGRAM));
272   m_memexp->set_io_space(&m_maincpu->space(AS_IO));
668273}
669274
670DRIVER_INIT_MEMBER(vtech1_state,vtech1h)
275DRIVER_INIT_MEMBER( vtech1_state, vtech1h )
671276{
672   address_space &prg = m_maincpu->space(AS_PROGRAM);
673
674277   DRIVER_INIT_CALL(vtech1);
675278
676   /* the SHRG mod replaces the standard videoram chip with an 8k chip */
279   // the SHRG mod replaces the standard videoram chip with an 8k chip
677280   m_videoram.allocate(0x2000);
678281
679   prg.install_readwrite_bank(0x7000, 0x77ff, "bank4");
282   m_maincpu->space(AS_PROGRAM).install_readwrite_bank(0x7000, 0x77ff, "bank4");
680283   membank("bank4")->configure_entries(0, 4, m_videoram, 0x800);
681284   membank("bank4")->set_entry(0);
682285}
683286
287
684288/***************************************************************************
685289    ADDRESS MAPS
686290***************************************************************************/
687291
688292static ADDRESS_MAP_START( laser110_mem, AS_PROGRAM, 8, vtech1_state )
689   AM_RANGE(0x0000, 0x3fff) AM_ROM /* basic rom */
690   AM_RANGE(0x4000, 0x5fff) AM_ROM /* dos rom or other catridges */
691   AM_RANGE(0x6000, 0x67ff) AM_ROM /* reserved for cartridges */
293   AM_RANGE(0x0000, 0x3fff) AM_ROM // basic rom
692294   AM_RANGE(0x6800, 0x6fff) AM_READWRITE(vtech1_keyboard_r, vtech1_latch_w)
693   AM_RANGE(0x7000, 0x77ff) AM_RAM AM_SHARE("videoram") /* (6847) */
694   AM_RANGE(0x7800, 0x7fff) AM_RAMBANK("bank1") /* 2k user ram */
695   AM_RANGE(0x8000, 0xbfff) AM_NOP /* 16k ram expansion */
696   AM_RANGE(0xc000, 0xffff) AM_NOP
295   AM_RANGE(0x7000, 0x77ff) AM_RAM AM_SHARE("videoram") // 6847
296   AM_RANGE(0x7800, 0x7fff) AM_RAM // 2k user ram
697297ADDRESS_MAP_END
698298
699299static ADDRESS_MAP_START( laser210_mem, AS_PROGRAM, 8, vtech1_state )
700   AM_RANGE(0x0000, 0x3fff) AM_ROM /* basic rom */
701   AM_RANGE(0x4000, 0x5fff) AM_ROM /* dos rom or other catridges */
702   AM_RANGE(0x6000, 0x67ff) AM_ROM /* reserved for cartridges */
300   AM_RANGE(0x0000, 0x3fff) AM_ROM // basic rom
703301   AM_RANGE(0x6800, 0x6fff) AM_READWRITE(vtech1_keyboard_r, vtech1_latch_w)
704   AM_RANGE(0x7000, 0x77ff) AM_RAM AM_SHARE("videoram") /* U7 (6847) */
705   AM_RANGE(0x7800, 0x8fff) AM_RAMBANK("bank1") /* 6k user ram */
706   AM_RANGE(0x9000, 0xcfff) AM_NOP /* 16k ram expansion */
707   AM_RANGE(0xd000, 0xffff) AM_NOP
302   AM_RANGE(0x7000, 0x77ff) AM_RAM AM_SHARE("videoram") // 6847
303   AM_RANGE(0x7800, 0x8fff) AM_RAM // 6k user ram
708304ADDRESS_MAP_END
709305
710306static ADDRESS_MAP_START( laser310_mem, AS_PROGRAM, 8, vtech1_state )
711   AM_RANGE(0x0000, 0x3fff) AM_ROM /* basic rom */
712   AM_RANGE(0x4000, 0x5fff) AM_ROM /* dos rom or other catridges */
713   AM_RANGE(0x6000, 0x67ff) AM_ROM /* reserved for cartridges */
307   AM_RANGE(0x0000, 0x3fff) AM_ROM // basic rom
714308   AM_RANGE(0x6800, 0x6fff) AM_READWRITE(vtech1_keyboard_r, vtech1_latch_w)
715   AM_RANGE(0x7000, 0x77ff) AM_RAM AM_SHARE("videoram") /* (6847) */
716   AM_RANGE(0x7800, 0xb7ff) AM_RAMBANK("bank1") /* 16k user ram */
717   AM_RANGE(0xb800, 0xf7ff) AM_NOP /* 16k ram expansion */
718   AM_RANGE(0xf8ff, 0xffff) AM_NOP
309   AM_RANGE(0x7000, 0x77ff) AM_RAM AM_SHARE("videoram") // 6847
310   AM_RANGE(0x7800, 0xb7ff) AM_RAM // 16k user ram
719311ADDRESS_MAP_END
720312
721313static ADDRESS_MAP_START( vtech1_io, AS_IO, 8, vtech1_state )
722314   ADDRESS_MAP_GLOBAL_MASK(0xff)
723   AM_RANGE(0x00, 0x00) AM_READ(vtech1_printer_r)
724   AM_RANGE(0x0d, 0x0d) AM_WRITE(vtech1_strobe_w)
725   AM_RANGE(0x0e, 0x0e) AM_DEVWRITE("cent_data_out", output_latch_device, write)
726   AM_RANGE(0x10, 0x1f) AM_READWRITE(vtech1_fdc_r, vtech1_fdc_w)
727   AM_RANGE(0x20, 0x2f) AM_READ(vtech1_joystick_r)
728   AM_RANGE(0x30, 0x3f) AM_READWRITE(vtech1_serial_r, vtech1_serial_w)
729315   AM_RANGE(0x40, 0x4f) AM_READ(vtech1_lightpen_r)
730   AM_RANGE(0x70, 0x7f) AM_WRITE(vtech1_memory_bank_w)
731316ADDRESS_MAP_END
732317
733318static ADDRESS_MAP_START( vtech1_shrg_io, AS_IO, 8, vtech1_state )
r30874r30875
813398   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("L  ?    [Insert]")        PORT_CODE(KEYCODE_L)     PORT_CHAR('L') PORT_CHAR('?')  PORT_CHAR(UCHAR_MAMEKEY(INSERT))
814399   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("H       CLS     SET")     PORT_CODE(KEYCODE_H)     PORT_CHAR('H')
815400
816   PORT_START("joystick_0")
817   PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED)
818   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON1)        PORT_PLAYER(1)
819   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_PLAYER(1)
820   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT)  PORT_PLAYER(1)
821   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN)  PORT_PLAYER(1)
822   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP)    PORT_PLAYER(1)
823
824   PORT_START("joystick_0_arm")
825   PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED)
826   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON2)        PORT_PLAYER(1)
827   PORT_BIT(0x0f, IP_ACTIVE_LOW, IPT_UNUSED)
828
829   PORT_START("joystick_1")
830   PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED)
831   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON1)        PORT_PLAYER(2)
832   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_PLAYER(2)
833   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT)  PORT_PLAYER(2)
834   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN)  PORT_PLAYER(2)
835   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP)    PORT_PLAYER(2)
836
837   PORT_START("joystick_1_arm")
838   PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED)
839   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON2)        PORT_PLAYER(2)
840   PORT_BIT(0x0f, IP_ACTIVE_LOW, IPT_UNUSED)
841
842401   /* Enhanced options not available on real hardware */
843402   PORT_START("CONFIG")
844403   PORT_CONFNAME( 0x01, 0x01, "Autorun on Quickload")
r30874r30875
851410
852411
853412/***************************************************************************
854    PALETTE
855***************************************************************************/
856
857static const UINT32 vtech1_palette_mono[] =
858{
859   rgb_t(131, 131, 131),
860   rgb_t(211, 211, 211),
861   rgb_t(29, 29, 29),
862   rgb_t(76, 76, 76),
863   rgb_t(213, 213, 213),
864   rgb_t(167, 167, 167),
865   rgb_t(105, 105, 105),
866   rgb_t(136, 136, 136),
867   rgb_t(0, 0, 0),
868   rgb_t(131, 131, 131),
869   rgb_t(0, 0, 0),
870   rgb_t(213, 213, 213),
871   rgb_t(37, 37, 37),
872   rgb_t(133, 133, 133),
873   rgb_t(28, 28, 28),
874   rgb_t(193, 193, 193)
875};
876
877
878/***************************************************************************
879413    MACHINE DRIVERS
880414***************************************************************************/
881415
r30874r30875
889423
890424static MACHINE_CONFIG_START( laser110, vtech1_state )
891425
892   /* basic machine hardware */
426   // basic machine hardware
893427   MCFG_CPU_ADD("maincpu", Z80, VTECH1_CLK)  /* 3.57950 MHz */
894428   MCFG_CPU_PROGRAM_MAP(laser110_mem)
895429   MCFG_CPU_IO_MAP(vtech1_io)
896430
897   /* video hardware */
431   // video hardware
898432   MCFG_SCREEN_MC6847_PAL_ADD("screen", "mc6847")
899433
900434   MCFG_DEVICE_ADD("mc6847", MC6847_PAL, XTAL_4_433619MHz)
901   MCFG_MC6847_FSYNC_CALLBACK(INPUTLINE("maincpu", 0))
435   MCFG_MC6847_FSYNC_CALLBACK(INPUTLINE("maincpu", 0)) MCFG_DEVCB_INVERT
902436   MCFG_MC6847_INPUT_CALLBACK(READ8(vtech1_state, mc6847_videoram_r))
903437   MCFG_MC6847_BW(true)
904438   MCFG_MC6847_FIXED_MODE(MC6847_MODE_GM1)
905439   // GM2 = GND, GM0 = GND, INTEXT = GND
906440   // other lines not connected
907441
908   /* sound hardware */
442   // sound hardware
909443   MCFG_SPEAKER_STANDARD_MONO("mono")
910444   MCFG_SOUND_WAVE_ADD(WAVE_TAG, "cassette")
911445   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
r30874r30875
913447   MCFG_SOUND_CONFIG(vtech1_speaker_interface)
914448   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75)
915449
916   /* printer */
917   MCFG_CENTRONICS_ADD("centronics", centronics_printers, "printer")
918   MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(vtech1_state, write_centronics_busy))
450   // peripheral and memory expansion slots
451   MCFG_IOEXP_SLOT_ADD("io")
452   MCFG_MEMEXP_SLOT_ADD("mem")
919453
920   MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
921
922   /* snapshot/quickload */
454   // snapshot
923455   MCFG_SNAPSHOT_ADD("snapshot", vtech1_state, vtech1, "vz", 1.5)
924456
925457   MCFG_CASSETTE_ADD( "cassette" )
926458   MCFG_CASSETTE_FORMATS(vtech1_cassette_formats)
927459   MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY)
928
929   /* cartridge */
930   MCFG_CARTSLOT_ADD("cart")
931   MCFG_CARTSLOT_EXTENSION_LIST("rom")
932
933   /* internal ram */
934   MCFG_RAM_ADD(RAM_TAG)
935   MCFG_RAM_DEFAULT_SIZE("2K")
936   MCFG_RAM_EXTRA_OPTIONS("18K,66K,4098K")
937
938   MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(vtech1_floppy_interface)
939460MACHINE_CONFIG_END
940461
941462static MACHINE_CONFIG_DERIVED( laser200, laser110 )
942463   MCFG_DEVICE_REMOVE("mc6847")
943464   MCFG_DEVICE_ADD("mc6847", MC6847_PAL, XTAL_4_433619MHz)
944   MCFG_MC6847_FSYNC_CALLBACK(INPUTLINE("maincpu", 0))
465   MCFG_MC6847_FSYNC_CALLBACK(INPUTLINE("maincpu", 0)) MCFG_DEVCB_INVERT
945466   MCFG_MC6847_INPUT_CALLBACK(READ8(vtech1_state, mc6847_videoram_r))
946467   MCFG_MC6847_FIXED_MODE(MC6847_MODE_GM1)
947468   // GM2 = GND, GM0 = GND, INTEXT = GND
r30874r30875
951472static MACHINE_CONFIG_DERIVED( laser210, laser200 )
952473   MCFG_CPU_MODIFY("maincpu")
953474   MCFG_CPU_PROGRAM_MAP(laser210_mem)
954
955   /* internal ram */
956   MCFG_RAM_MODIFY(RAM_TAG)
957   MCFG_RAM_DEFAULT_SIZE("6K")
958   MCFG_RAM_EXTRA_OPTIONS("22K,66K,4098K")
959475MACHINE_CONFIG_END
960476
961477static MACHINE_CONFIG_DERIVED( laser310, laser200 )
962478   MCFG_CPU_REPLACE("maincpu", Z80, VZ300_XTAL1_CLK / 5)  /* 3.546894 MHz */
963479   MCFG_CPU_PROGRAM_MAP(laser310_mem)
964480   MCFG_CPU_IO_MAP(vtech1_io)
965
966   /* internal ram */
967   MCFG_RAM_MODIFY(RAM_TAG)
968   MCFG_RAM_DEFAULT_SIZE("16K")
969   MCFG_RAM_EXTRA_OPTIONS("32K,66K,4098K")
970481MACHINE_CONFIG_END
971482
972483static MACHINE_CONFIG_DERIVED( laser310h, laser310 )
r30874r30875
975486
976487   MCFG_DEVICE_REMOVE("mc6847")
977488   MCFG_DEVICE_ADD("mc6847", MC6847_PAL, XTAL_4_433619MHz)
978   MCFG_MC6847_FSYNC_CALLBACK(INPUTLINE("maincpu", 0))
489   MCFG_MC6847_FSYNC_CALLBACK(INPUTLINE("maincpu", 0)) MCFG_DEVCB_INVERT
979490   MCFG_MC6847_INPUT_CALLBACK(READ8(vtech1_state, mc6847_videoram_r))
980491   MCFG_MC6847_FIXED_MODE(MC6847_MODE_GM1)
981492   // INTEXT = GND
r30874r30875
988499***************************************************************************/
989500
990501ROM_START( laser110 )
991   ROM_REGION(0x6800, "maincpu", 0)
992   ROM_LOAD("vtechv12.u09",   0x0000, 0x2000, CRC(99412d43) SHA1(6aed8872a0818be8e1b08ecdfd92acbe57a3c96d))
993   ROM_LOAD("vtechv12.u10",   0x2000, 0x2000, CRC(e4c24e8b) SHA1(9d8fb3d24f3d4175b485cf081a2d5b98158ab2fb))
994   ROM_CART_LOAD("cart",  0x4000, 0x27ff, ROM_NOMIRROR | ROM_OPTIONAL)
502   ROM_REGION(0x4000, "maincpu", 0)
503   ROM_LOAD("vtechv12.u09", 0x0000, 0x2000, CRC(99412d43) SHA1(6aed8872a0818be8e1b08ecdfd92acbe57a3c96d))
504   ROM_LOAD("vtechv12.u10", 0x2000, 0x2000, CRC(e4c24e8b) SHA1(9d8fb3d24f3d4175b485cf081a2d5b98158ab2fb))
995505ROM_END
996506
997#if 0
998/* The VZ-200 sold in Germany and the Netherlands came with BASIC V1.1, which
999   is currently not dumped. */
507// The VZ-200 sold in Germany and the Netherlands came with BASIC V1.1, which is currently not dumped.
1000508ROM_START( vz200de )
1001   ROM_REGION(0x6800, "maincpu", 0)
1002   ROM_LOAD("vtechv11.u09",   0x0000, 0x2000, NO_DUMP)
1003   ROM_LOAD("vtechv11.u10",   0x2000, 0x2000, NO_DUMP)
1004   ROM_CART_LOAD("cart",  0x4000, 0x27ff, ROM_NOMIRROR | ROM_OPTIONAL)
509   ROM_REGION(0x4000, "maincpu", 0)
510   ROM_LOAD("vtechv11.u09", 0x0000, 0x2000, NO_DUMP)
511   ROM_LOAD("vtechv11.u10", 0x2000, 0x2000, NO_DUMP)
1005512ROM_END
1006#endif
1007513
1008514#define rom_las110de    rom_laser110
1009515#define rom_laser200    rom_laser110
1010#define rom_fellow  rom_laser110
516#define rom_fellow     rom_laser110
1011517
1012/* It's possible that the Texet TX8000 came with BASIC V1.0, but this
1013   needs to be verified */
518// It's possible that the Texet TX-8000 came with BASIC V1.0, but this needs to be verified
1014519#define rom_tx8000  rom_laser110
1015520
1016521ROM_START( laser210 )
1017   ROM_REGION(0x6800, "maincpu", 0)
1018   ROM_LOAD("vtechv20.u09",   0x0000, 0x2000, CRC(cc854fe9) SHA1(6e66a309b8e6dc4f5b0b44e1ba5f680467353d66))
1019   ROM_LOAD("vtechv20.u10",   0x2000, 0x2000, CRC(7060f91a) SHA1(8f3c8f24f97ebb98f3c88d4e4ba1f91ffd563440))
1020   ROM_CART_LOAD("cart",  0x4000, 0x27ff, ROM_NOMIRROR | ROM_OPTIONAL)
522   ROM_REGION(0x4000, "maincpu", 0)
523   ROM_LOAD("vtechv20.u09", 0x0000, 0x2000, CRC(cc854fe9) SHA1(6e66a309b8e6dc4f5b0b44e1ba5f680467353d66))
524   ROM_LOAD("vtechv20.u10", 0x2000, 0x2000, CRC(7060f91a) SHA1(8f3c8f24f97ebb98f3c88d4e4ba1f91ffd563440))
1021525ROM_END
1022526
1023527#define rom_las210de    rom_laser210
1024#define rom_vz200   rom_laser210
528#define rom_vz200      rom_laser210
1025529
1026530ROM_START( laser310 )
1027   ROM_REGION(0x6800, "maincpu", 0)
531   ROM_REGION(0x4000, "maincpu", 0)
1028532   ROM_SYSTEM_BIOS(0, "basic20", "BASIC V2.0")
1029533   ROMX_LOAD("vtechv20.u12", 0x0000, 0x4000, CRC(613de12c) SHA1(f216c266bc09b0dbdbad720796e5ea9bc7d91e53), ROM_BIOS(1))
1030534   ROM_SYSTEM_BIOS(1, "basic21", "BASIC V2.1 (hack)")
1031535   ROMX_LOAD("vtechv21.u12", 0x0000, 0x4000, CRC(f7df980f) SHA1(5ba14a7a2eedca331b033901080fa5d205e245ea), ROM_BIOS(2))
1032   ROM_CART_LOAD("cart", 0x4000, 0x27ff, ROM_NOMIRROR | ROM_OPTIONAL)
1033536ROM_END
1034537
1035#define rom_vz300   rom_laser310
538#define rom_vz300      rom_laser310
1036539#define rom_laser310h   rom_laser310
1037540
541
1038542/***************************************************************************
1039543    GAME DRIVERS
1040544***************************************************************************/
1041545
1042/*    YEAR  NAME       PARENT    COMPAT     MACHINE    INPUT   INIT     COMPANY                   FULLNAME                          FLAGS */
1043COMP( 1983, laser110,  0,        0,         laser110,  vtech1, vtech1_state, vtech1,  "Video Technology",       "Laser 110",                      0 )
1044COMP( 1983, las110de,  laser110, 0,         laser110,  vtech1, vtech1_state, vtech1,  "Sanyo",                  "Laser 110 (Germany)",            0 )
1045COMP( 1983, laser200,  0,        laser110,  laser200,  vtech1, vtech1_state, vtech1,  "Video Technology",       "Laser 200",                      0 )
1046//COMP( 1983, vz200de,   laser200, 0,         laser200,  vtech1, vtech1_state, vtech1,  "Video Technology",       "VZ-200 (Germany & Netherlands)", 0 )
1047COMP( 1983, fellow,    laser200, 0,         laser200,  vtech1, vtech1_state, vtech1,  "Salora",                 "Fellow (Finland)",               0 )
1048COMP( 1983, tx8000,    laser200, 0,         laser200,  vtech1, vtech1_state, vtech1,  "Texet",                  "TX-8000 (UK)",                   0 )
1049COMP( 1984, laser210,  0,        laser200,  laser210,  vtech1, vtech1_state, vtech1,  "Video Technology",       "Laser 210",                      0 )
1050COMP( 1984, vz200,     laser210, 0,         laser210,  vtech1, vtech1_state, vtech1,  "Dick Smith Electronics", "VZ-200 (Oceania)",               0 )
1051COMP( 1984, las210de,  laser210, 0,         laser210,  vtech1, vtech1_state, vtech1,  "Sanyo",                  "Laser 210 (Germany)",            0 )
1052COMP( 1984, laser310,  0,        laser200,  laser310,  vtech1, vtech1_state, vtech1,  "Video Technology",       "Laser 310",                      0 )
1053COMP( 1984, vz300,     laser310, 0,         laser310,  vtech1, vtech1_state, vtech1,  "Dick Smith Electronics", "VZ-300 (Oceania)",               0 )
1054COMP( 1984, laser310h, laser310, 0,         laser310h, vtech1, vtech1_state, vtech1h, "Video Technology",       "Laser 310 (SHRG)",               GAME_UNOFFICIAL)
546//    YEAR  NAME       PARENT    COMPAT  MACHINE    INPUT   INIT                   COMPANY                   FULLNAME                          FLAGS
547COMP( 1983, laser110,  0,        0,      laser110,  vtech1, vtech1_state, vtech1,  "Video Technology",       "Laser 110",                      0 )
548COMP( 1983, laser200,  0,        0,      laser200,  vtech1, vtech1_state, vtech1,  "Video Technology",       "Laser 200",                      0 )
549COMP( 1983, vz200de,   laser200, 0,      laser200,  vtech1, vtech1_state, vtech1,  "Video Technology",       "VZ-200 (Germany & Netherlands)", 0 )
550COMP( 1983, fellow,    laser200, 0,      laser200,  vtech1, vtech1_state, vtech1,  "Salora",                 "Fellow (Finland)",               0 )
551COMP( 1983, tx8000,    laser200, 0,      laser200,  vtech1, vtech1_state, vtech1,  "Texet",                  "TX-8000 (UK)",                   0 )
552COMP( 1984, laser210,  0,        0,      laser210,  vtech1, vtech1_state, vtech1,  "Video Technology",       "Laser 210",                      0 )
553COMP( 1984, vz200,     laser210, 0,      laser210,  vtech1, vtech1_state, vtech1,  "Dick Smith Electronics", "VZ-200 (Oceania)",               0 )
554COMP( 1984, laser310,  0,        0,      laser310,  vtech1, vtech1_state, vtech1,  "Video Technology",       "Laser 310",                      0 )
555COMP( 1984, vz300,     laser310, 0,      laser310,  vtech1, vtech1_state, vtech1,  "Dick Smith Electronics", "VZ-300 (Oceania)",               0 )
556COMP( 1984, laser310h, laser310, 0,      laser310h, vtech1, vtech1_state, vtech1h, "Video Technology",       "Laser 310 (SHRG)",               GAME_UNOFFICIAL)
trunk/src/mess/mess.mak
r30874r30875
614614BUSES += VIC20
615615BUSES += VIDBRAIN
616616BUSES += VIP
617BUSES += VTECH_IOEXP
618BUSES += VTECH_MEMEXP
617619BUSES += WANGPC
618620BUSES += X68K
619621BUSES += Z88

Previous 199869 Revisions Next


© 1997-2024 The MAME Team