Previous 15994 Revisions Next

r9715 Friday 3rd December, 2010 at 14:26:50 UTC by Curt Coder
[QL] Refactored driver to define ADDRESS_MAP_MODERN, refactored ZX8301 into a C++ device, and cleaned up memory handling.
[docs]messnew.txt
[src/mess/drivers]ql.c
[src/mess/includes]ql.h
[src/mess/video]zx8301.c zx8301.h

src/mess/video/zx8301.c
r9714r9715
1111
1212    TODO:
1313
14    - use resnet for colors
14   - wait state on memory access during video update
1515    - proper video timing
16   - get rid of flash timer
1617
1718*/
1819
1920#include "emu.h"
2021#include "zx8301.h"
2122
22/***************************************************************************
23    PARAMETERS
24***************************************************************************/
2523
24
25//**************************************************************************
26//   MACROS / CONSTANTS
27//**************************************************************************
28
2629#define LOG 0
2730
31
32// low resolution palette
2833static const int ZX8301_COLOR_MODE4[] = { 0, 2, 4, 7 };
2934
30/***************************************************************************
31    TYPE DEFINITIONS
32***************************************************************************/
3335
34typedef struct _zx8301_t zx8301_t;
35struct _zx8301_t
36
37//**************************************************************************
38//  GLOBAL VARIABLES
39//**************************************************************************
40
41// devices
42const device_type ZX8301 = zx8301_device_config::static_alloc_device_config;
43
44
45// default address map
46static ADDRESS_MAP_START( zx8301, 0, 8 )
47   AM_RANGE(0x00000, 0x1ffff) AM_RAM
48ADDRESS_MAP_END
49
50
51
52//**************************************************************************
53//  DEVICE CONFIGURATION
54//**************************************************************************
55
56//-------------------------------------------------
57//  zx8301_device_config - constructor
58//-------------------------------------------------
59
60zx8301_device_config::zx8301_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock)
61   : device_config(mconfig, static_alloc_device_config, "Sinclair ZX8301", tag, owner, clock),
62     device_config_memory_interface(mconfig, *this),
63     m_space_config("videoram", ENDIANNESS_LITTLE, 8, 17, 0, NULL, *ADDRESS_MAP_NAME(zx8301))
3664{
37   devcb_resolved_read8      in_ram_func;
38   devcb_resolved_write8      out_ram_func;
39   devcb_resolved_write_line   out_vsync_func;
65}
4066
41   screen_device *screen;   /* screen */
4267
43   int dispoff;               /* display off */
44   int mode8;                  /* mode8 active */
45   int base;                  /* video ram base address */
46   int flash;                  /* flash */
47   int vsync;                  /* vertical sync */
48   int vda;                  /* valid data address */
68//-------------------------------------------------
69//  static_alloc_device_config - allocate a new
70//  configuration object
71//-------------------------------------------------
4972
50   /* timers */
51   emu_timer *flash_timer;         /* flash timer */
52   emu_timer *vsync_timer;         /* vertical sync timer */
73device_config *zx8301_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock)
74{
75   return global_alloc(zx8301_device_config(mconfig, tag, owner, clock));
76}
5377
54   running_device *cpu;
55};
5678
57/***************************************************************************
58    INLINE FUNCTIONS
59***************************************************************************/
79//-------------------------------------------------
80//  alloc_device - allocate a new device object
81//-------------------------------------------------
6082
61INLINE zx8301_t *get_safe_token(running_device *device)
83device_t *zx8301_device_config::alloc_device(running_machine &machine) const
6284{
63   assert(device != NULL);
85   return auto_alloc(&machine, zx8301_device(machine, *this));
86}
6487
65   return (zx8301_t *)downcast<legacy_device_base *>(device)->token();
88
89//-------------------------------------------------
90//  memory_space_config - return a description of
91//  any address spaces owned by this device
92//-------------------------------------------------
93
94const address_space_config *zx8301_device_config::memory_space_config(int spacenum) const
95{
96   return (spacenum == 0) ? &m_space_config : NULL;
6697}
6798
68INLINE const zx8301_interface *get_interface(running_device *device)
99
100//-------------------------------------------------
101//  device_config_complete - perform any
102//  operations now that the configuration is
103//  complete
104//-------------------------------------------------
105
106void zx8301_device_config::device_config_complete()
69107{
70   assert(device != NULL);
71   assert((device->type() == ZX8301));
72   return (const zx8301_interface *) device->baseconfig().static_config();
108   // inherit a copy of the static data
109   const zx8301_interface *intf = reinterpret_cast<const zx8301_interface *>(static_config());
110   if (intf != NULL)
111      *static_cast<zx8301_interface *>(this) = *intf;
112
113   // or initialize to defaults if none provided
114   else
115   {
116      memset(&out_vsync_func, 0, sizeof(out_vsync_func));
117   }
73118}
74119
75/***************************************************************************
76    IMPLEMENTATION
77***************************************************************************/
78120
79/*-------------------------------------------------
80    TIMER_CALLBACK( zx8301_flash_tick )
81-------------------------------------------------*/
82121
83static TIMER_CALLBACK( zx8301_flash_tick )
122//**************************************************************************
123//  INLINE HELPERS
124//**************************************************************************
125
126//-------------------------------------------------
127//  readbyte - read a byte at the given address
128//-------------------------------------------------
129
130inline UINT8 zx8301_device::readbyte(offs_t address)
84131{
85   zx8301_t *zx8301 = get_safe_token((running_device *)ptr);
132   return space()->read_byte(address);
133}
86134
87   zx8301->flash = !zx8301->flash;
135
136//-------------------------------------------------
137//  writebyte - write a byte at the given address
138//-------------------------------------------------
139
140inline void zx8301_device::writebyte(offs_t address, UINT8 data)
141{
142   space()->write_byte(address, data);
88143}
89144
90/*-------------------------------------------------
91    TIMER_CALLBACK( zx8301_vsync_tick )
92-------------------------------------------------*/
93145
94static TIMER_CALLBACK( zx8301_vsync_tick )
146
147//**************************************************************************
148//  LIVE DEVICE
149//**************************************************************************
150
151//-------------------------------------------------
152//  zx8301_device - constructor
153//-------------------------------------------------
154
155zx8301_device::zx8301_device(running_machine &_machine, const zx8301_device_config &config)
156    : device_t(_machine, config),
157     device_memory_interface(_machine, config, *this),
158     m_dispoff(1),
159     m_mode8(0),
160     m_base(0),
161     m_flash(1),
162     m_vsync(1),
163     m_vda(0),
164      m_config(config)
95165{
96   zx8301_t *zx8301 = get_safe_token((running_device *)ptr);
166}
97167
98   //zx8301->vsync = !zx8301->vsync;
99168
100   devcb_call_write_line(&zx8301->out_vsync_func, zx8301->vsync);
169//-------------------------------------------------
170//  device_start - device-specific startup
171//-------------------------------------------------
172
173void zx8301_device::device_start()
174{
175   // get the CPU
176   m_cpu = machine->device<cpu_device>(m_config.cpu_tag);
177   assert(m_cpu != NULL);
178
179   // get the screen device
180   m_screen = machine->device<screen_device>(m_config.screen_tag);
181   assert(m_screen != NULL);
182
183   // resolve callbacks
184    devcb_resolve_write_line(&m_out_vsync_func, &m_config.out_vsync_func, this);
185   
186   // allocate timers
187   m_vsync_timer = device_timer_alloc(*this, TIMER_VSYNC);
188   m_flash_timer = device_timer_alloc(*this, TIMER_FLASH);
189
190   // adjust timer periods
191   timer_adjust_periodic(m_vsync_timer, attotime_zero, 0, ATTOTIME_IN_HZ(50));
192   timer_adjust_periodic(m_flash_timer, ATTOTIME_IN_HZ(2), 0, ATTOTIME_IN_HZ(2));
193
194   // register for state saving
195   state_save_register_device_item(this, 0, m_dispoff);
196   state_save_register_device_item(this, 0, m_mode8);
197   state_save_register_device_item(this, 0, m_base);
198    state_save_register_device_item(this, 0, m_flash);
199   state_save_register_device_item(this, 0, m_vsync);
200   state_save_register_device_item(this, 0, m_vda);
101201}
102202
103/*-------------------------------------------------
104    PALETTE_INIT( zx8301 )
105-------------------------------------------------*/
106203
107PALETTE_INIT( zx8301 )
204//-------------------------------------------------
205//  device_timer - handler timer events
206//-------------------------------------------------
207
208void zx8301_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
108209{
109   palette_set_color_rgb(machine, 0, 0x00, 0x00, 0x00 ); // black
110   palette_set_color_rgb(machine, 1, 0x00, 0x00, 0xff ); // blue
111   palette_set_color_rgb(machine, 2, 0xff, 0x00, 0x00 ); // red
112   palette_set_color_rgb(machine, 3, 0xff, 0x00, 0xff ); // magenta
113   palette_set_color_rgb(machine, 4, 0x00, 0xff, 0x00 ); // green
114   palette_set_color_rgb(machine, 5, 0x00, 0xff, 0xff ); // cyan
115   palette_set_color_rgb(machine, 6, 0xff, 0xff, 0x00 ); // yellow
116   palette_set_color_rgb(machine, 7, 0xff, 0xff, 0xff ); // white
210   switch (id)
211   {
212   case TIMER_VSYNC:
213      //m_vsync = !m_vsync;
214      devcb_call_write_line(&m_out_vsync_func, m_vsync);
215      break;
216
217   case TIMER_FLASH:
218      m_flash = !m_flash;
219      break;
220   }
117221}
118222
119/*-------------------------------------------------
120    zx8301_control_w - display control register
121-------------------------------------------------*/
122223
123WRITE8_DEVICE_HANDLER( zx8301_control_w )
224//-------------------------------------------------
225//  control_w - display control register
226//-------------------------------------------------
227
228WRITE8_MEMBER( zx8301_device::control_w )
124229{
125   zx8301_t *zx8301 = get_safe_token(device);
230   /*
126231
232      bit      description
233
234      0
235      1      display off
236      2
237      3      graphics mode
238      4
239      5
240      6
241      7      display base address
242
243   */
244
127245   if (LOG) logerror("ZX8301 Control: %02x\n", data);
128246
129   zx8301->dispoff = BIT(data, 1);
130   zx8301->mode8 = BIT(data, 3);
131   zx8301->base = BIT(data, 7);
247   // display off
248   m_dispoff = BIT(data, 1);
249
250   // graphics mode
251   m_mode8 = BIT(data, 3);
252
253   // display base address
254   m_base = BIT(data, 7);
132255}
133256
134/*-------------------------------------------------
135    zx8301_ram_r - RAM access
136-------------------------------------------------*/
137257
138READ8_DEVICE_HANDLER( zx8301_ram_r )
258//-------------------------------------------------
259//  data_r - RAM read
260//-------------------------------------------------
261
262READ8_MEMBER( zx8301_device::data_r )
139263{
140   zx8301_t *zx8301 = get_safe_token(device);
141
142264   if (LOG) logerror("ZX8301 RAM Read: %06x\n", offset);
143265
144   if (zx8301->vda)
266   if (m_vda)
145267   {
146      cpu_spinuntil_time(zx8301->cpu, zx8301->screen->time_until_pos(256, 0));
268      cpu_spinuntil_time(m_cpu, m_screen->time_until_pos(256, 0));
147269   }
148270
149   return devcb_call_read8(&zx8301->in_ram_func, offset);
271   return readbyte(offset);
150272}
151273
152/*-------------------------------------------------
153    zx8301_ram_w - RAM access
154-------------------------------------------------*/
155274
156WRITE8_DEVICE_HANDLER( zx8301_ram_w )
275//-------------------------------------------------
276//  data_w - RAM write
277//-------------------------------------------------
278
279WRITE8_MEMBER( zx8301_device::data_w )
157280{
158   zx8301_t *zx8301 = get_safe_token(device);
159
160281   if (LOG) logerror("ZX8301 RAM Write: %06x = %02x\n", offset, data);
161282
162   if (zx8301->vda)
283   if (m_vda)
163284   {
164      cpu_spinuntil_time(zx8301->cpu, zx8301->screen->time_until_pos(256, 0));
285      cpu_spinuntil_time(m_cpu, m_screen->time_until_pos(256, 0));
165286   }
166287
167   devcb_call_write8(&zx8301->out_ram_func, offset, data);
288   writebyte(offset, data);
168289}
169290
170/*-------------------------------------------------
171    zx8301_draw_line_mode4 - high resolution
172    line drawing routine
173-------------------------------------------------*/
174291
175static void zx8301_draw_line_mode4(running_device *device, bitmap_t *bitmap, int y, UINT16 da)
292//-------------------------------------------------
293//  draw_line_mode4 - draw mode 4 line
294//-------------------------------------------------
295
296void zx8301_device::draw_line_mode4(bitmap_t *bitmap, int y, UINT16 da)
176297{
177   zx8301_t *zx8301 = get_safe_token(device);
178
179   int word, pixel, x = 0;
180
181   for (word = 0; word < 64; word++)
298   for (int word = 0; word < 64; word++)
182299   {
183      UINT8 byte_high = devcb_call_read8(&zx8301->in_ram_func, da++);
184      UINT8 byte_low = devcb_call_read8(&zx8301->in_ram_func, da++);
300      UINT8 byte_high = readbyte(da++);
301      UINT8 byte_low = readbyte(da++);
185302
186      for (pixel = 0; pixel < 8; pixel++)
303      for (int pixel = 0; pixel < 8; pixel++)
187304      {
305         int x = 0;
188306         int red = BIT(byte_low, 7);
189307         int green = BIT(byte_high, 7);
190308         int color = (green << 1) | red;
r9714r9715
197315   }
198316}
199317
200/*-------------------------------------------------
201    zx8301_draw_line_mode4 - low resolution
202    line drawing routine
203-------------------------------------------------*/
204318
205static void zx8301_draw_line_mode8(running_device *device, bitmap_t *bitmap, int y, UINT16 da)
319//-------------------------------------------------
320//  draw_line_mode8 - draw mode 8 line
321//-------------------------------------------------
322
323void zx8301_device::draw_line_mode8(bitmap_t *bitmap, int y, UINT16 da)
206324{
207   zx8301_t *zx8301 = get_safe_token(device);
208
209   int word, pixel, x = 0;
210
211   for (word = 0; word < 64; word++)
325   for (int word = 0; word < 64; word++)
212326   {
213      UINT8 byte_high = devcb_call_read8(&zx8301->in_ram_func, da++);
214      UINT8 byte_low = devcb_call_read8(&zx8301->in_ram_func, da++);
327      UINT8 byte_high = readbyte(da++);
328      UINT8 byte_low = readbyte(da++);
215329
216      for (pixel = 0; pixel < 4; pixel++)
330      for (int pixel = 0; pixel < 4; pixel++)
217331      {
332         int x = 0;
218333         int red = BIT(byte_low, 7);
219334         int green = BIT(byte_high, 7);
220335         int blue = BIT(byte_low, 6);
r9714r9715
222337
223338         int color = (green << 2) | (red << 1) | blue;
224339
225         if (flash && zx8301->flash)
340         if (flash && m_flash)
226341         {
227342            color = 0;
228343         }
r9714r9715
236351   }
237352}
238353
239/*-------------------------------------------------
240    zx8301_draw_screen - draw screen
241-------------------------------------------------*/
242354
243static void zx8301_draw_screen(running_device *device, bitmap_t *bitmap)
355//-------------------------------------------------
356//  update_screen -
357//-------------------------------------------------
358
359void zx8301_device::update_screen(bitmap_t *bitmap, const rectangle *cliprect)
244360{
245   zx8301_t *zx8301 = get_safe_token(device);
361   if (!m_dispoff)
362   {
363      UINT32 da = m_base << 15;
246364
247   UINT32 da = zx8301->base << 15;
248   int y;
365      for (int y = 0; y < 256; y++)
366      {
367         if (m_mode8)
368         {
369            draw_line_mode8(bitmap, y, da);
370         }
371         else
372         {
373            draw_line_mode4(bitmap, y, da);
374         }
249375
250   zx8301->vda = 1;
251
252   for (y = 0; y < 256; y++)
253   {
254      if (zx8301->mode8)
255      {
256         zx8301_draw_line_mode8(device, bitmap, y, da);
376         da += 128;
257377      }
258      else
259      {
260         zx8301_draw_line_mode4(device, bitmap, y, da);
261      }
262
263      da += 128;
264378   }
265
266   zx8301->vda = 0;
267}
268
269/*-------------------------------------------------
270    zx8301_draw_screen - screen update
271-------------------------------------------------*/
272
273void zx8301_update(running_device *device, bitmap_t *bitmap, const rectangle *cliprect)
274{
275   zx8301_t *zx8301 = get_safe_token(device);
276
277   if (!zx8301->dispoff)
278   {
279      zx8301_draw_screen(device, bitmap);
280   }
281379   else
282380   {
283      bitmap_fill(bitmap, cliprect, get_black_pen(zx8301->screen->machine));
381      bitmap_fill(bitmap, cliprect, get_black_pen(machine));
284382   }
285383}
286
287/*-------------------------------------------------
288    DEVICE_START( zx8301 )
289-------------------------------------------------*/
290
291static DEVICE_START( zx8301 )
292{
293   zx8301_t *zx8301 = get_safe_token(device);
294   const zx8301_interface *intf = get_interface(device);
295
296   /* resolve callbacks */
297   devcb_resolve_read8(&zx8301->in_ram_func, &intf->in_ram_func, device);
298   devcb_resolve_write8(&zx8301->out_ram_func, &intf->out_ram_func, device);
299   devcb_resolve_write_line(&zx8301->out_vsync_func, &intf->out_vsync_func, device);
300
301   /* set initial values */
302   zx8301->vsync = 1;
303
304   /* get the cpu */
305   zx8301->cpu = device->machine->device(intf->cpu_tag);
306
307   /* get the screen device */
308   zx8301->screen = device->machine->device<screen_device>(intf->screen_tag);
309   assert(zx8301->screen != NULL);
310
311   /* create the timers */
312   zx8301->vsync_timer = timer_alloc(device->machine, zx8301_vsync_tick, (void *)device);
313   timer_adjust_periodic(zx8301->vsync_timer, attotime_zero, 0, ATTOTIME_IN_HZ(50)); // HACK
314
315   zx8301->flash_timer = timer_alloc(device->machine, zx8301_flash_tick, (void *)device);
316   timer_adjust_periodic(zx8301->flash_timer, ATTOTIME_IN_HZ(2), 0, ATTOTIME_IN_HZ(2));
317
318   /* register for state saving */
319   state_save_register_item(device->machine, "zx8301", device->tag(), 0, zx8301->dispoff);
320   state_save_register_item(device->machine, "zx8301", device->tag(), 0, zx8301->mode8);
321   state_save_register_item(device->machine, "zx8301", device->tag(), 0, zx8301->base);
322   state_save_register_item(device->machine, "zx8301", device->tag(), 0, zx8301->flash);
323   state_save_register_item(device->machine, "zx8301", device->tag(), 0, zx8301->vsync);
324   state_save_register_item(device->machine, "zx8301", device->tag(), 0, zx8301->vda);
325}
326
327/*-------------------------------------------------
328    DEVICE_RESET( zx8301 )
329-------------------------------------------------*/
330
331static DEVICE_RESET( zx8301 )
332{
333//  zx8301_t *zx8301 = get_safe_token(device);
334}
335
336/*-------------------------------------------------
337    DEVICE_GET_INFO( zx8301 )
338-------------------------------------------------*/
339
340DEVICE_GET_INFO( zx8301 )
341{
342   switch (state)
343   {
344      /* --- the following bits of info are returned as 64-bit signed integers --- */
345      case DEVINFO_INT_TOKEN_BYTES:               info->i = sizeof(zx8301_t);                  break;
346      case DEVINFO_INT_INLINE_CONFIG_BYTES:         info->i = 0;                           break;
347
348      /* --- the following bits of info are returned as pointers to data or functions --- */
349      case DEVINFO_FCT_START:                     info->start = DEVICE_START_NAME(zx8301);      break;
350      case DEVINFO_FCT_STOP:                     /* Nothing */                           break;
351      case DEVINFO_FCT_RESET:                     info->reset = DEVICE_RESET_NAME(zx8301);      break;
352
353      /* --- the following bits of info are returned as NULL-terminated strings --- */
354      case DEVINFO_STR_NAME:                     strcpy(info->s, "Sinclair ZX8301");            break;
355      case DEVINFO_STR_FAMILY:                  strcpy(info->s, "Sinclair QL");               break;
356      case DEVINFO_STR_VERSION:                  strcpy(info->s, "1.0");                     break;
357      case DEVINFO_STR_SOURCE_FILE:               strcpy(info->s, __FILE__);                  break;
358      case DEVINFO_STR_CREDITS:                  strcpy(info->s, "Copyright MESS Team");         break;
359   }
360}
361
362DEFINE_LEGACY_DEVICE(ZX8301, zx8301);
src/mess/video/zx8301.h
r9714r9715
3030
3131**********************************************************************/
3232
33#pragma once
34
3335#ifndef __ZX8301__
3436#define __ZX8301__
3537
3638#include "emu.h"
37#include "devcb.h"
3839
39/***************************************************************************
40    MACROS / CONSTANTS
41***************************************************************************/
4240
43DECLARE_LEGACY_DEVICE(ZX8301, zx8301);
4441
42///*************************************************************************
43//   MACROS / CONSTANTS
44///*************************************************************************
45
46
47
48
49///*************************************************************************
50//  INTERFACE CONFIGURATION MACROS
51///*************************************************************************
52
4553#define MDRV_ZX8301_ADD(_tag, _clock, _config) \
4654   MDRV_DEVICE_ADD(_tag, ZX8301, _clock) \
4755   MDRV_DEVICE_CONFIG(_config)
r9714r9715
4957#define ZX8301_INTERFACE(name) \
5058   const zx8301_interface(name) =
5159
52/***************************************************************************
53    TYPE DEFINITIONS
54***************************************************************************/
5560
56typedef struct _zx8301_interface zx8301_interface;
57struct _zx8301_interface
58{
59   const char *cpu_tag;      /* cpu we are working with */
60   const char *screen_tag;      /* screen we are acting on */
6161
62   /* this gets called for every memory read */
63   devcb_read8         in_ram_func;
62///*************************************************************************
63//   TYPE DEFINITIONS
64///*************************************************************************
6465
65   /* this gets called for every memory write */
66   devcb_write8      out_ram_func;
66// ======================> zx8301_interface
6767
68   /* this gets called for every change of the VSYNC pin (pin 11) */
68struct zx8301_interface
69{
70   const char *cpu_tag;
71   const char *screen_tag;
72
6973   devcb_write_line   out_vsync_func;
7074};
7175
72/***************************************************************************
73    PROTOTYPES
74***************************************************************************/
7576
76/* register access */
77WRITE8_DEVICE_HANDLER( zx8301_control_w );
7877
79/* palette initialization */
80PALETTE_INIT( zx8301 );
78// ======================> zx8301_device_config
8179
82/* memory access */
83READ8_DEVICE_HANDLER( zx8301_ram_r );
84WRITE8_DEVICE_HANDLER( zx8301_ram_w );
80class zx8301_device_config :   public device_config,
81                        public device_config_memory_interface,
82                                public zx8301_interface
83{
84    friend class zx8301_device;
8585
86/* screen update */
87void zx8301_update(running_device *device, bitmap_t *bitmap, const rectangle *cliprect);
86    // construction/destruction
87    zx8301_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock);
8888
89public:
90    // allocators
91    static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock);
92    virtual device_t *alloc_device(running_machine &machine) const;
93
94protected:
95   // device_config overrides
96   virtual void device_config_complete();
97
98   // device_config_memory_interface overrides
99   virtual const address_space_config *memory_space_config(int spacenum = 0) const;
100
101    // address space configurations
102   const address_space_config      m_space_config;
103};
104
105
106
107// ======================> zx8301_device
108
109class zx8301_device :   public device_t,
110                  public device_memory_interface
111{
112    friend class zx8301_device_config;
113
114    // construction/destruction
115    zx8301_device(running_machine &_machine, const zx8301_device_config &_config);
116
117public:
118   DECLARE_WRITE8_MEMBER( control_w );
119    DECLARE_READ8_MEMBER( data_r );
120    DECLARE_WRITE8_MEMBER( data_w );
121
122   void update_screen(bitmap_t *bitmap, const rectangle *cliprect);
123
124protected:
125    // device-level overrides
126    virtual void device_start();
127   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
128
129   inline UINT8 readbyte(offs_t address);
130   inline void writebyte(offs_t address, UINT8 data);
131
132   void draw_line_mode4(bitmap_t *bitmap, int y, UINT16 da);
133   void draw_line_mode8(bitmap_t *bitmap, int y, UINT16 da);
134
135private:
136   static const device_timer_id TIMER_VSYNC = 0;
137   static const device_timer_id TIMER_FLASH = 1;
138
139   devcb_resolved_write_line   m_out_vsync_func;
140
141   cpu_device *m_cpu;
142   screen_device *m_screen;
143   address_space *m_data;
144
145   int m_dispoff;               // display off
146   int m_mode8;               // mode8 active
147   int m_base;                  // video ram base address
148   int m_flash;               // flash
149   int m_vsync;               // vertical sync
150   int m_vda;                  // valid data address
151
152   emu_timer *m_vsync_timer;      // vertical sync timer
153   emu_timer *m_flash_timer;      // flash timer
154
155   const zx8301_device_config &m_config;
156};
157
158
159// device type definition
160extern const device_type ZX8301;
161
162
163
89164#endif
src/mess/includes/ql.h
r9714r9715
88#define I8051_TAG   "i8051"
99#define ZX8301_TAG   "ic22"
1010#define ZX8302_TAG   "ic23"
11#define SPEAKER_TAG   "speaker"
1112
1213#define MDV1_TAG   "mdv1"
1314#define MDV2_TAG   "mdv2"
r9714r9715
2223{
2324public:
2425   ql_state(running_machine &machine, const driver_device_config_base &config)
25      : driver_device(machine, config) { }
26      : driver_device(machine, config),
27        m_maincpu(*this, M68008_TAG),
28        m_ipc(*this, I8749_TAG),
29        m_zx8301(*this, ZX8301_TAG),
30        m_zx8302(*this, ZX8302_TAG),
31        m_speaker(*this, SPEAKER_TAG),
32        m_ram(*this, "messram")
33   { }
2634
35   required_device<cpu_device> m_maincpu;
36   required_device<cpu_device> m_ipc;
37   required_device<zx8301_device> m_zx8301;
38   required_device<running_device> m_zx8302;
39   required_device<running_device> m_speaker;
40   required_device<running_device> m_ram;
41
42   virtual void machine_start();
43
44   virtual bool video_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect);
45
46   DECLARE_WRITE8_MEMBER( ipc_w );
47   DECLARE_WRITE8_MEMBER( ipc_port1_w );
48   DECLARE_WRITE8_MEMBER( ipc_port2_w );
49   DECLARE_READ8_MEMBER( ipc_port2_r );
50   DECLARE_READ8_MEMBER( ipc_t1_r );
51   DECLARE_READ8_MEMBER( ipc_bus_r );
52   DECLARE_READ8_MEMBER( ql_ram_r );
53   DECLARE_WRITE8_MEMBER( ql_ram_w );
54   DECLARE_WRITE_LINE_MEMBER( ql_baudx4_w );
55   DECLARE_WRITE_LINE_MEMBER( ql_comdata_w );
56
2757   /* IPC state */
28   UINT8 keylatch;
29   int ser1_txd;
30   int ser1_dtr;
31   int ser2_rxd;
32   int ser2_cts;
33   int ipl;
34   int comctl;
35   int comdata;
36   int baudx4;
37
38   /* devices */
39   running_device *zx8301;
40   running_device *zx8302;
58   UINT8 m_keylatch;
59   int m_ser1_txd;
60   int m_ser1_dtr;
61   int m_ser2_rxd;
62   int m_ser2_cts;
63   int m_ipl;
64   int m_comdata;
65   int m_baudx4;
4166};
4267
4368#endif
src/mess/drivers/ql.c
r9714r9715
1010
1111    TODO:
1212
13   - use resnet.h to create palette
1314    - Tyche bios is broken
1415    - several disk interfaces (720K/1.44MB/3.2MB)
1516    - discrete sound
r9714r9715
3738
3839*/
3940
41#define ADDRESS_MAP_MODERN
42
4043#include "emu.h"
41#include "cpu/mcs51/mcs51.h"
42#include "includes/ql.h"
43#include "cpu/mcs48/mcs48.h"
4444#include "cpu/m68000/m68000.h"
45#include "devices/flopdrv.h"
46#include "formats/basicdsk.h"
45#include "cpu/mcs48/mcs48.h"
46#include "cpu/mcs51/mcs51.h"
4747#include "devices/cartslot.h"
48#include "devices/flopdrv.h"
49#include "devices/messram.h"
4850#include "devices/microdrv.h"
49#include "devices/snapquik.h"
51#include "formats/basicdsk.h"
52#include "machine/zx8302.h"
5053#include "sound/speaker.h"
5154#include "video/zx8301.h"
52#include "machine/zx8302.h"
53#include "devices/messram.h"
55#include "includes/ql.h"
5456
55static QUICKLOAD_LOAD( ql );
56
5757/* Intelligent Peripheral Controller (IPC) */
5858
59static WRITE8_HANDLER( ipc_w )
59WRITE8_MEMBER( ql_state::ipc_w )
6060{
61   ql_state *state = space->machine->driver_data<ql_state>();
62
63   // pulse COMCTL line
64
65   zx8302_comctl_w(state->zx8302, 0);
66   zx8302_comctl_w(state->zx8302, 1);
61   zx8302_comctl_w(m_zx8302, 0);
62   zx8302_comctl_w(m_zx8302, 1);
6763}
6864
69static WRITE8_HANDLER( ipc_port1_w )
65WRITE8_MEMBER( ql_state::ipc_port1_w )
7066{
7167   /*
7268
r9714r9715
8379
8480    */
8581
86   ql_state *state = space->machine->driver_data<ql_state>();
87
88   state->keylatch = data;
82   m_keylatch = data;
8983}
9084
91static WRITE8_HANDLER( ipc_port2_w )
85WRITE8_MEMBER( ql_state::ipc_port2_w )
9286{
9387   /*
9488
r9714r9715
10599
106100    */
107101
108   running_device *speaker = space->machine->device("speaker");
109   ql_state *state = space->machine->driver_data<ql_state>();
110
111102   int ipl = (BIT(data, 2) << 1) | BIT(data, 3);
112103
113   if (ipl != state->ipl)
104   if (ipl != m_ipl)
114105   {
115106      switch (ipl)
116107      {
117108      case 0:
118         cputag_set_input_line(space->machine, M68008_TAG, M68K_IRQ_7, ASSERT_LINE);
109         cpu_set_input_line(m_maincpu, M68K_IRQ_7, ASSERT_LINE);
119110         break;
120111
121112      case 1:
122113         // CTRL-ALT-7 pressed
123         cputag_set_input_line(space->machine, M68008_TAG, M68K_IRQ_5, ASSERT_LINE);
114         cpu_set_input_line(m_maincpu, M68K_IRQ_5, ASSERT_LINE);
124115         break;
125116
126117      case 2:
127         cputag_set_input_line(space->machine, M68008_TAG, M68K_IRQ_2, ASSERT_LINE);
118         cpu_set_input_line(m_maincpu, M68K_IRQ_2, ASSERT_LINE);
128119         break;
129120
130121      case 3:
131         cputag_set_input_line(space->machine, M68008_TAG, M68K_IRQ_7, CLEAR_LINE);
122         cpu_set_input_line(m_maincpu, M68K_IRQ_7, CLEAR_LINE);
132123         break;
133124      }
134125
135      state->ipl = ipl;
126      m_ipl = ipl;
136127   }
137128
138   speaker_level_w(speaker, BIT(data, 1));
129   speaker_level_w(m_speaker, BIT(data, 1));
139130
140   state->ser2_cts = BIT(data, 4);
141   state->ser1_dtr = BIT(data, 5);
131   m_ser2_cts = BIT(data, 4);
132   m_ser1_dtr = BIT(data, 5);
142133
143   state->comdata = BIT(data, 7);
134   m_comdata = BIT(data, 7);
144135
145   zx8302_comdata_w(state->zx8302, BIT(data, 7));
136   zx8302_comdata_w(m_zx8302, BIT(data, 7));
146137}
147138
148static READ8_HANDLER( ipc_port2_r )
139READ8_MEMBER( ql_state::ipc_port2_r )
149140{
150141   /*
151142
r9714r9715
162153
163154    */
164155
165   ql_state *state = space->machine->driver_data<ql_state>();
156   int irq = (m_ser2_rxd | m_ser1_txd);
166157
167   int irq = (state->ser2_rxd | state->ser1_txd);
158   cpu_set_input_line(m_ipc, INPUT_LINE_IRQ0, irq);
168159
169   cputag_set_input_line(space->machine, I8749_TAG, INPUT_LINE_IRQ0, irq);
170
171   return (state->comdata << 7) | irq;
160   return (m_comdata << 7) | irq;
172161}
173162
174static READ8_HANDLER( ipc_t1_r )
163READ8_MEMBER( ql_state::ipc_t1_r )
175164{
176   ql_state *state = space->machine->driver_data<ql_state>();
177
178   return state->baudx4;
165   return m_baudx4;
179166}
180167
181static READ8_HANDLER( ipc_bus_r )
168READ8_MEMBER( ql_state::ipc_bus_r )
182169{
183   ql_state *state = space->machine->driver_data<ql_state>();
184
185170   /*
186171
187172        bit     description
r9714r9715
199184
200185   UINT8 data = 0;
201186
202   if (BIT(state->keylatch, 0)) data |= input_port_read(space->machine, "ROW0") | input_port_read(space->machine, "JOY0");
203   if (BIT(state->keylatch, 1)) data |= input_port_read(space->machine, "ROW1") | input_port_read(space->machine, "JOY1");
204   if (BIT(state->keylatch, 2)) data |= input_port_read(space->machine, "ROW2");
205   if (BIT(state->keylatch, 3)) data |= input_port_read(space->machine, "ROW3");
206   if (BIT(state->keylatch, 4)) data |= input_port_read(space->machine, "ROW4");
207   if (BIT(state->keylatch, 5)) data |= input_port_read(space->machine, "ROW5");
208   if (BIT(state->keylatch, 6)) data |= input_port_read(space->machine, "ROW6");
209   if (BIT(state->keylatch, 7)) data |= input_port_read(space->machine, "ROW7");
187   if (BIT(m_keylatch, 0)) data |= input_port_read(machine, "ROW0") | input_port_read(machine, "JOY0");
188   if (BIT(m_keylatch, 1)) data |= input_port_read(machine, "ROW1") | input_port_read(machine, "JOY1");
189   if (BIT(m_keylatch, 2)) data |= input_port_read(machine, "ROW2");
190   if (BIT(m_keylatch, 3)) data |= input_port_read(machine, "ROW3");
191   if (BIT(m_keylatch, 4)) data |= input_port_read(machine, "ROW4");
192   if (BIT(m_keylatch, 5)) data |= input_port_read(machine, "ROW5");
193   if (BIT(m_keylatch, 6)) data |= input_port_read(machine, "ROW6");
194   if (BIT(m_keylatch, 7)) data |= input_port_read(machine, "ROW7");
210195
211196   return data;
212197}
213198
214199/* Memory Maps */
215200
216static ADDRESS_MAP_START( ql_map, ADDRESS_SPACE_PROGRAM, 8 )
201static ADDRESS_MAP_START( ql_map, ADDRESS_SPACE_PROGRAM, 8, ql_state )
217202   AM_RANGE(0x000000, 0x00bfff) AM_ROM   // 48K System ROM
218   AM_RANGE(0x00c000, 0x00ffff) AM_ROMBANK("bank1") // 16K Cartridge ROM
203   AM_RANGE(0x00c000, 0x00ffff) AM_ROM // 16K Cartridge ROM
219204   AM_RANGE(0x010000, 0x017fff) AM_UNMAP // 32K Expansion I/O
220   AM_RANGE(0x018000, 0x018003) AM_DEVREAD(ZX8302_TAG, zx8302_rtc_r)
221   AM_RANGE(0x018000, 0x018001) AM_DEVWRITE(ZX8302_TAG, zx8302_rtc_w)
222   AM_RANGE(0x018002, 0x018002) AM_DEVWRITE(ZX8302_TAG, zx8302_control_w)
223   AM_RANGE(0x018003, 0x018003) AM_DEVWRITE(ZX8302_TAG, zx8302_ipc_command_w)
224   AM_RANGE(0x018020, 0x018020) AM_DEVREADWRITE(ZX8302_TAG, zx8302_status_r, zx8302_mdv_control_w)
225   AM_RANGE(0x018021, 0x018021) AM_DEVREADWRITE(ZX8302_TAG, zx8302_irq_status_r, zx8302_irq_acknowledge_w)
226   AM_RANGE(0x018022, 0x018022) AM_DEVREADWRITE(ZX8302_TAG, zx8302_mdv_track_r, zx8302_data_w)
227   AM_RANGE(0x018023, 0x018023) AM_DEVREAD(ZX8302_TAG, zx8302_mdv_track_r) AM_WRITENOP
228   AM_RANGE(0x018063, 0x018063) AM_DEVWRITE(ZX8301_TAG, zx8301_control_w)
205   AM_RANGE(0x018000, 0x018003) AM_DEVREAD_LEGACY(ZX8302_TAG, zx8302_rtc_r)
206   AM_RANGE(0x018000, 0x018001) AM_DEVWRITE_LEGACY(ZX8302_TAG, zx8302_rtc_w)
207   AM_RANGE(0x018002, 0x018002) AM_DEVWRITE_LEGACY(ZX8302_TAG, zx8302_control_w)
208   AM_RANGE(0x018003, 0x018003) AM_DEVWRITE_LEGACY(ZX8302_TAG, zx8302_ipc_command_w)
209   AM_RANGE(0x018020, 0x018020) AM_DEVREADWRITE_LEGACY(ZX8302_TAG, zx8302_status_r, zx8302_mdv_control_w)
210   AM_RANGE(0x018021, 0x018021) AM_DEVREADWRITE_LEGACY(ZX8302_TAG, zx8302_irq_status_r, zx8302_irq_acknowledge_w)
211   AM_RANGE(0x018022, 0x018022) AM_DEVREADWRITE_LEGACY(ZX8302_TAG, zx8302_mdv_track_r, zx8302_data_w)
212   AM_RANGE(0x018023, 0x018023) AM_DEVREAD_LEGACY(ZX8302_TAG, zx8302_mdv_track_r) AM_WRITENOP
213   AM_RANGE(0x018063, 0x018063) AM_DEVWRITE(ZX8301_TAG, zx8301_device, control_w)
229214   AM_RANGE(0x01c000, 0x01ffff) AM_UNMAP // 16K Expansion I/O
230   AM_RANGE(0x020000, 0x03ffff) AM_DEVREADWRITE(ZX8301_TAG, zx8301_ram_r, zx8301_ram_w)
231   AM_RANGE(0x040000, 0x0fffff) AM_RAMBANK("bank2")
215   AM_RANGE(0x020000, 0x03ffff) AM_DEVREADWRITE(ZX8301_TAG, zx8301_device, data_r, data_w)
216   AM_RANGE(0x040000, 0x0fffff) AM_RAM
232217ADDRESS_MAP_END
233218
234static ADDRESS_MAP_START( ipc_io_map, ADDRESS_SPACE_IO, 8 )
219static ADDRESS_MAP_START( ipc_io_map, ADDRESS_SPACE_IO, 8, ql_state )
235220   AM_RANGE(0x00, 0x7f) AM_WRITE(ipc_w)
236221   AM_RANGE(0x27, 0x28) AM_READNOP // IPC reads these to set P0 (bus) to Hi-Z mode
237222   AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_WRITE(ipc_port1_w)
r9714r9715
470455
471456/* ZX8301 Interface */
472457
473static READ8_HANDLER( ql_ram_r )
474{
475   return messram_get_ptr(space->machine->device("messram"))[offset];
476}
477
478static WRITE8_HANDLER( ql_ram_w )
479{
480   messram_get_ptr(space->machine->device("messram"))[offset] = data;
481}
482
483458static ZX8301_INTERFACE( ql_zx8301_intf )
484459{
485460   M68008_TAG,
486461   SCREEN_TAG,
487   DEVCB_MEMORY_HANDLER(M68008_TAG, PROGRAM, ql_ram_r),
488   DEVCB_MEMORY_HANDLER(M68008_TAG, PROGRAM, ql_ram_w),
489462   DEVCB_DEVICE_LINE(ZX8302_TAG, zx8302_vsync_w)
490463};
491464
492465/* ZX8302 Interface */
493466
494static WRITE_LINE_DEVICE_HANDLER( ql_baudx4_w )
467WRITE_LINE_MEMBER( ql_state::ql_baudx4_w )
495468{
496   ql_state *driver_state = device->machine->driver_data<ql_state>();
497
498   driver_state->baudx4 = state;
469   m_baudx4 = state;
499470}
500471
501static WRITE_LINE_DEVICE_HANDLER( ql_comdata_w )
472WRITE_LINE_MEMBER( ql_state::ql_comdata_w )
502473{
503   ql_state *driver_state = device->machine->driver_data<ql_state>();
504
505   driver_state->comdata = state;
474   m_comdata = state;
506475}
507476
508477static ZX8302_INTERFACE( ql_zx8302_intf )
r9714r9715
511480   MDV1_TAG,
512481   MDV2_TAG,
513482   DEVCB_CPU_INPUT_LINE(M68008_TAG, M68K_IRQ_2),
514   DEVCB_LINE(ql_baudx4_w),
515   DEVCB_LINE(ql_comdata_w)
483   DEVCB_DRIVER_LINE_MEMBER(ql_state, ql_baudx4_w),
484   DEVCB_DRIVER_LINE_MEMBER(ql_state, ql_comdata_w)
516485};
517486
518static VIDEO_UPDATE( ql )
487static PALETTE_INIT( ql )
519488{
520   ql_state *state = screen->machine->driver_data<ql_state>();
489   palette_set_color_rgb(machine, 0, 0x00, 0x00, 0x00 ); // black
490   palette_set_color_rgb(machine, 1, 0x00, 0x00, 0xff ); // blue
491   palette_set_color_rgb(machine, 2, 0xff, 0x00, 0x00 ); // red
492   palette_set_color_rgb(machine, 3, 0xff, 0x00, 0xff ); // magenta
493   palette_set_color_rgb(machine, 4, 0x00, 0xff, 0x00 ); // green
494   palette_set_color_rgb(machine, 5, 0x00, 0xff, 0xff ); // cyan
495   palette_set_color_rgb(machine, 6, 0xff, 0xff, 0x00 ); // yellow
496   palette_set_color_rgb(machine, 7, 0xff, 0xff, 0xff ); // white
497}
521498
522   zx8301_update(state->zx8301, bitmap, cliprect);
499bool ql_state::video_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect)
500{
501   m_zx8301->update_screen(&bitmap, &cliprect);
523502
524503   return 0;
525504}
526505
527506/* Machine Drivers */
528507
529static MACHINE_START( ql )
508void ql_state::machine_start()
530509{
531   ql_state *state = machine->driver_data<ql_state>();
510   address_space *program = cpu_get_address_space(m_maincpu, ADDRESS_SPACE_PROGRAM);
532511
533   address_space *program = cputag_get_address_space(machine, M68008_TAG, ADDRESS_SPACE_PROGRAM);
534
535   /* configure ROM cartridge */
536
537   memory_unmap_readwrite(program, 0x00c000, 0x00ffff, 0, 0);
538   memory_configure_bank(machine, "bank1", 0, 1, memory_region(machine, M68008_TAG) + 0x00c000, 0);
539   memory_set_bank(machine, "bank1", 0);
540
541   /* configure RAM */
542
543   switch (messram_get_size(machine->device("messram")))
512   // configure RAM
513   switch (messram_get_size(m_ram))
544514   {
545515   case 128*1024:
546516      memory_unmap_readwrite(program, 0x040000, 0x0fffff, 0, 0);
547517      break;
548518
549519   case 192*1024:
550      memory_install_readwrite_bank(program, 0x040000, 0x04ffff, 0, 0, "bank2");
551520      memory_unmap_readwrite(program, 0x050000, 0x0fffff, 0, 0);
552521      break;
553522
554523   case 256*1024:
555      memory_install_readwrite_bank(program, 0x040000, 0x05ffff, 0, 0, "bank2");
556524      memory_unmap_readwrite(program, 0x060000, 0x0fffff, 0, 0);
557525      break;
558526
559527   case 384*1024:
560      memory_install_readwrite_bank(program, 0x040000, 0x07ffff, 0, 0, "bank2");
561528      memory_unmap_readwrite(program, 0x080000, 0x0fffff, 0, 0);
562529      break;
563530
564531   case 640*1024:
565      memory_install_readwrite_bank(program, 0x040000, 0x0bffff, 0, 0, "bank2");
566532      memory_unmap_readwrite(program, 0x0c0000, 0x0fffff, 0, 0);
567533      break;
568
569   case 896*1024:
570      memory_install_readwrite_bank(program, 0x040000, 0x0fffff, 0, 0, "bank2");
571      break;
572534   }
573535
574   memory_configure_bank(machine, "bank2", 0, 1, memory_region(machine, M68008_TAG) + 0x050000, 0);
575   memory_set_bank(machine, "bank2", 0);
576
577   // find devices
578
579   state->zx8301 = machine->device(ZX8301_TAG);
580   state->zx8302 = machine->device(ZX8302_TAG);
581
582536   // register for state saving
583
584   state_save_register_global(machine, state->keylatch);
585   state_save_register_global(machine, state->ser1_txd);
586   state_save_register_global(machine, state->ser1_dtr);
587   state_save_register_global(machine, state->ser2_rxd);
588   state_save_register_global(machine, state->ser2_cts);
589   state_save_register_global(machine, state->ipl);
590   state_save_register_global(machine, state->comdata);
591   state_save_register_global(machine, state->comctl);
592   state_save_register_global(machine, state->baudx4);
537   state_save_register_global(machine, m_keylatch);
538   state_save_register_global(machine, m_ser1_txd);
539   state_save_register_global(machine, m_ser1_dtr);
540   state_save_register_global(machine, m_ser2_rxd);
541   state_save_register_global(machine, m_ser2_cts);
542   state_save_register_global(machine, m_ipl);
543   state_save_register_global(machine, m_comdata);
544   state_save_register_global(machine, m_baudx4);
593545}
594546
595static DEVICE_IMAGE_LOAD( ql_cart )
596{
597//  UINT8 *ptr = memory_region(image.device().machine, M68008_TAG) + 0x00c000;
598//  int filesize = image.length();
599//
600//  if (filesize <= 16 * 1024)
601//  {
602//      if (image.fread( ptr, filesize) == filesize)
603//      {
604//          memory_install_read_bank(cputag_get_address_space(image.device().machine, M68008_TAG, ADDRESS_SPACE_PROGRAM), 0x00c000, 0x00ffff, 0, 0, "bank1");
605//          memory_unmap_write(cputag_get_address_space(image.device().machine, M68008_TAG, ADDRESS_SPACE_PROGRAM), 0x00c000, 0x00ffff, 0, 0);
606//
607//          return IMAGE_INIT_PASS;
608//      }
609//  }
610//
611   return IMAGE_INIT_FAIL;
612}
613
614
615static FLOPPY_OPTIONS_START(ql)
547static FLOPPY_OPTIONS_START( ql )
616548   FLOPPY_OPTION(ql, "dsk", "SSSD disk image", basicdsk_identify_default, basicdsk_construct_default,
617549      HEADS([1])
618550      TRACKS([40])
r9714r9715
658590};
659591
660592static MACHINE_CONFIG_START( ql, ql_state )
661
662593   // basic machine hardware
663594   MDRV_CPU_ADD(M68008_TAG, M68008, X1/2)
664595   MDRV_CPU_PROGRAM_MAP(ql_map)
r9714r9715
666597   MDRV_CPU_ADD(I8749_TAG, I8749, X4)
667598   MDRV_CPU_IO_MAP(ipc_io_map)
668599
669   MDRV_MACHINE_START(ql)
670
671600   MDRV_ZX8302_ADD(ZX8302_TAG, X1, ql_zx8302_intf)
672601
673602   MDRV_DEVICE_ADD(MDV1_TAG, MICRODRIVE, 0)
674603   MDRV_DEVICE_ADD(MDV2_TAG, MICRODRIVE, 0)
675604
676605   // video hardware
677
678606   MDRV_SCREEN_ADD(SCREEN_TAG, RASTER)
679607   MDRV_SCREEN_REFRESH_RATE(50.08)
680608   MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
r9714r9715
683611   MDRV_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
684612
685613   MDRV_PALETTE_LENGTH(8)
686   MDRV_PALETTE_INIT(zx8301)
687   MDRV_VIDEO_UPDATE(ql)
614   MDRV_PALETTE_INIT(ql)
688615
689616   MDRV_ZX8301_ADD(ZX8301_TAG, X1, ql_zx8301_intf)
690617
r9714r9715
693620   MDRV_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
694621   MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
695622
696   /* quickload */
697   MDRV_QUICKLOAD_ADD("quickload", ql, "bas", 0)
698
699623   /* cartridge */
700624   MDRV_CARTSLOT_ADD("cart")
701   MDRV_CARTSLOT_EXTENSION_LIST("bin")
625   MDRV_CARTSLOT_EXTENSION_LIST("bin,rom")
702626   MDRV_CARTSLOT_NOT_MANDATORY
703   MDRV_CARTSLOT_LOAD(ql_cart)
704627
705628   MDRV_FLOPPY_2_DRIVES_ADD(ql_floppy_config)
706629
r9714r9715
711634MACHINE_CONFIG_END
712635
713636static MACHINE_CONFIG_DERIVED( ql_ntsc, ql )
714
715637   MDRV_SCREEN_MODIFY(SCREEN_TAG)
716638   MDRV_SCREEN_REFRESH_RATE(60)
717639   MDRV_SCREEN_SIZE(960, 262)
r9714r9715
719641MACHINE_CONFIG_END
720642
721643static MACHINE_CONFIG_DERIVED( opd, ql )
722
723644   /* internal ram */
724645   MDRV_RAM_MODIFY("messram")
725646   MDRV_RAM_DEFAULT_SIZE("128K")
r9714r9715
727648MACHINE_CONFIG_END
728649
729650static MACHINE_CONFIG_DERIVED( megaopd, ql )
730
731651   /* internal ram */
732652   MDRV_RAM_MODIFY("messram")
733653   MDRV_RAM_DEFAULT_SIZE("256K")
r9714r9715
735655
736656/* ROMs */
737657
738#define ROM_IPC   \
739   ROM_REGION( 0x800, I8749_TAG, 0 )\
740   ROM_LOAD( "ipc8049.ic24", 0x0000, 0x0800, CRC(6a0d1f20) SHA1(fcb1c97ee7c66e5b6d8fbb57c06fd2f6509f2e1b) )
741
742658ROM_START( ql )
743    ROM_REGION( 0x400000, M68008_TAG, 0 )
744   ROM_SYSTEM_BIOS( 0, "default", "v1.10 (JS)" )
745   ROMX_LOAD( "ql.js 0000.ic33", 0x000000, 0x008000, CRC(1bbad3b8) SHA1(59fd4372771a630967ee102760f4652904d7d5fa), ROM_BIOS(1) )
746    ROMX_LOAD( "ql.js 8000.ic34", 0x008000, 0x004000, CRC(c970800e) SHA1(b8c9203026a7de6a44bd0942ec9343e8b222cb41), ROM_BIOS(1) )
747
748   ROM_SYSTEM_BIOS( 1, "tb", "v1.0? (TB)" )
749   ROMX_LOAD( "tb.ic33", 0x000000, 0x008000, BAD_DUMP CRC(1c86d688) SHA1(7df8028e6671afc4ebd5f65bf6c2d6019181f239), ROM_BIOS(2) )
750    ROMX_LOAD( "tb.ic34", 0x008000, 0x004000, BAD_DUMP CRC(de7f9669) SHA1(9d6bc0b794541a4cec2203256ae92c7e68d1011d), ROM_BIOS(2) )
751
752   ROM_SYSTEM_BIOS( 2, "jm", "v1.03 (JM)" )
753   ROMX_LOAD( "ql.jm 0000.ic33", 0x000000, 0x008000, CRC(1f8e840a) SHA1(7929e716dfe88318bbe99e34f47d039957fe3cc0), ROM_BIOS(3) )
754    ROMX_LOAD( "ql.jm 8000.ic34", 0x008000, 0x004000, CRC(9168a2e9) SHA1(1e7c47a59fc40bd96dfefc2f4d86827c15f0199e), ROM_BIOS(3) )
755
756   ROM_SYSTEM_BIOS( 3, "ah", "v1.02 (AH)" )
757   ROMX_LOAD( "ah.ic33.1", 0x000000, 0x004000, BAD_DUMP CRC(a9b4d2df) SHA1(142d6f01a9621aff5e0ad678bd3cbf5cde0db801), ROM_BIOS(4) )
758    ROMX_LOAD( "ah.ic33.2", 0x004000, 0x004000, BAD_DUMP CRC(36488e4e) SHA1(ff6f597b30ea03ce480a3d6728fd1d858da34d6a), ROM_BIOS(4) )
759   ROMX_LOAD( "ah.ic34",   0x008000, 0x004000, BAD_DUMP CRC(61259d4c) SHA1(bdd10d111e7ba488551a27c8d3b2743917ff1307), ROM_BIOS(4) )
760
761   ROM_SYSTEM_BIOS( 4, "pm", "v1.01 (PM)" )
762   ROMX_LOAD( "pm.ic33", 0x000000, 0x008000, NO_DUMP, ROM_BIOS(5) )
763    ROMX_LOAD( "pm.ic34", 0x008000, 0x004000, NO_DUMP, ROM_BIOS(5) )
764
765   ROM_SYSTEM_BIOS( 5, "fb", "v1.00 (FB)" )
766    ROMX_LOAD( "fb.ic33", 0x000000, 0x008000, NO_DUMP, ROM_BIOS(6) )
767    ROMX_LOAD( "fb.ic34", 0x008000, 0x004000, NO_DUMP, ROM_BIOS(6) )
768
659    ROM_REGION( 0x10000, M68008_TAG, 0 )
660   ROM_DEFAULT_BIOS("js")
661   ROM_SYSTEM_BIOS( 0, "fb", "v1.00 (FB)" )
662    ROMX_LOAD( "fb.ic33", 0x0000, 0x8000, NO_DUMP, ROM_BIOS(1) )
663    ROMX_LOAD( "fb.ic34", 0x8000, 0x4000, NO_DUMP, ROM_BIOS(1) )
664   ROM_SYSTEM_BIOS( 1, "pm", "v1.01 (PM)" )
665   ROMX_LOAD( "pm.ic33", 0x0000, 0x8000, NO_DUMP, ROM_BIOS(2) )
666    ROMX_LOAD( "pm.ic34", 0x8000, 0x4000, NO_DUMP, ROM_BIOS(2) )
667   ROM_SYSTEM_BIOS( 2, "ah", "v1.02 (AH)" )
668   ROMX_LOAD( "ah.ic33.1", 0x0000, 0x4000, BAD_DUMP CRC(a9b4d2df) SHA1(142d6f01a9621aff5e0ad678bd3cbf5cde0db801), ROM_BIOS(3) )
669    ROMX_LOAD( "ah.ic33.2", 0x4000, 0x4000, BAD_DUMP CRC(36488e4e) SHA1(ff6f597b30ea03ce480a3d6728fd1d858da34d6a), ROM_BIOS(3) )
670   ROMX_LOAD( "ah.ic34",   0x8000, 0x4000, BAD_DUMP CRC(61259d4c) SHA1(bdd10d111e7ba488551a27c8d3b2743917ff1307), ROM_BIOS(3) )
671   ROM_SYSTEM_BIOS( 3, "jm", "v1.03 (JM)" )
672   ROMX_LOAD( "ql.jm 0000.ic33", 0x0000, 0x8000, CRC(1f8e840a) SHA1(7929e716dfe88318bbe99e34f47d039957fe3cc0), ROM_BIOS(4) )
673    ROMX_LOAD( "ql.jm 8000.ic34", 0x8000, 0x4000, CRC(9168a2e9) SHA1(1e7c47a59fc40bd96dfefc2f4d86827c15f0199e), ROM_BIOS(4) )
674   ROM_SYSTEM_BIOS( 4, "tb", "v1.0? (TB)" )
675   ROMX_LOAD( "tb.ic33", 0x0000, 0x8000, BAD_DUMP CRC(1c86d688) SHA1(7df8028e6671afc4ebd5f65bf6c2d6019181f239), ROM_BIOS(5) )
676    ROMX_LOAD( "tb.ic34", 0x8000, 0x4000, BAD_DUMP CRC(de7f9669) SHA1(9d6bc0b794541a4cec2203256ae92c7e68d1011d), ROM_BIOS(5) )
677   ROM_SYSTEM_BIOS( 5, "js", "v1.10 (JS)" )
678   ROMX_LOAD( "ql.js 0000.ic33", 0x0000, 0x8000, CRC(1bbad3b8) SHA1(59fd4372771a630967ee102760f4652904d7d5fa), ROM_BIOS(6) )
679    ROMX_LOAD( "ql.js 8000.ic34", 0x8000, 0x4000, CRC(c970800e) SHA1(b8c9203026a7de6a44bd0942ec9343e8b222cb41), ROM_BIOS(6) )
769680   ROM_SYSTEM_BIOS( 6, "tyche", "v2.05 (Tyche)" )
770    ROMX_LOAD( "tyche.rom", 0x000000, 0x010000, CRC(8724b495) SHA1(5f33a1bc3f23fd09c31844b65bc3aca7616f180a), ROM_BIOS(7) )
771
681    ROMX_LOAD( "tyche.rom", 0x0000, 0x010000, CRC(8724b495) SHA1(5f33a1bc3f23fd09c31844b65bc3aca7616f180a), ROM_BIOS(7) )
772682   ROM_SYSTEM_BIOS( 7, "min189", "Minerva v1.89" )
773    ROMX_LOAD( "minerva.rom", 0x000000, 0x00c000, BAD_DUMP CRC(930befe3) SHA1(84a99c4df13b97f90baf1ec8cb6c2e52e3e1bb4d), ROM_BIOS(8) )
683    ROMX_LOAD( "minerva.rom", 0x0000, 0x00c000, BAD_DUMP CRC(930befe3) SHA1(84a99c4df13b97f90baf1ec8cb6c2e52e3e1bb4d), ROM_BIOS(8) )
684   ROM_CART_LOAD("cart", 0xc000, 0x4000, ROM_MIRROR | ROM_OPTIONAL)
774685
775   ROM_IPC
776   /*
777    ROM_REGION( 0x400, "plds", 0 )
686   ROM_REGION( 0x800, I8749_TAG, 0 )
687   ROM_LOAD( "ipc8049.ic24", 0x000, 0x800, CRC(6a0d1f20) SHA1(fcb1c97ee7c66e5b6d8fbb57c06fd2f6509f2e1b) )
688
689   ROM_REGION( 0x400, "plds", 0 )
778690    ROM_LOAD( "hal16l8.ic38", 0x0000, 0x0400, NO_DUMP )
779    */
780691ROM_END
781692
782693ROM_START( ql_us )
783    ROM_REGION( 0x400000, M68008_TAG, 0 )
784    ROM_LOAD( "jsu.ic33", 0x000000, 0x008000, BAD_DUMP CRC(e397f49f) SHA1(c06f92eabaf3e6dd298c51cb7f7535d8ef0ef9c5) )
785    ROM_LOAD( "jsu.ic34", 0x008000, 0x004000, BAD_DUMP CRC(3debbacc) SHA1(9fbc3e42ec463fa42f9c535d63780ff53a9313ec) )
694    ROM_REGION( 0x10000, M68008_TAG, 0 )
695    ROM_LOAD( "jsu.ic33", 0x0000, 0x8000, BAD_DUMP CRC(e397f49f) SHA1(c06f92eabaf3e6dd298c51cb7f7535d8ef0ef9c5) )
696    ROM_LOAD( "jsu.ic34", 0x8000, 0x4000, BAD_DUMP CRC(3debbacc) SHA1(9fbc3e42ec463fa42f9c535d63780ff53a9313ec) )
697   ROM_CART_LOAD("cart", 0xc000, 0x4000, ROM_MIRROR | ROM_OPTIONAL)
786698
787   ROM_IPC
699   ROM_REGION( 0x800, I8749_TAG, 0 )
700   ROM_LOAD( "ipc8049.ic24", 0x000, 0x800, CRC(6a0d1f20) SHA1(fcb1c97ee7c66e5b6d8fbb57c06fd2f6509f2e1b) )
701
702   ROM_REGION( 0x400, "plds", 0 )
703    ROM_LOAD( "hal16l8.ic38", 0x0000, 0x0400, NO_DUMP )
788704ROM_END
789705
790706ROM_START( ql_es )
791    ROM_REGION( 0x400000, M68008_TAG, 0 )
792    ROM_LOAD( "mge.ic33", 0x000000, 0x008000, BAD_DUMP CRC(d5293bde) SHA1(bf5af7e53a472d4e9871f182210787d601db0634) )
793    ROM_LOAD( "mge.ic34", 0x008000, 0x004000, BAD_DUMP CRC(a694f8d7) SHA1(bd2868656008de85d7c191598588017ae8aa3339) )
707    ROM_REGION( 0x10000, M68008_TAG, 0 )
708    ROM_LOAD( "mge.ic33", 0x0000, 0x8000, BAD_DUMP CRC(d5293bde) SHA1(bf5af7e53a472d4e9871f182210787d601db0634) )
709    ROM_LOAD( "mge.ic34", 0x8000, 0x4000, BAD_DUMP CRC(a694f8d7) SHA1(bd2868656008de85d7c191598588017ae8aa3339) )
710   ROM_CART_LOAD("cart", 0xc000, 0x4000, ROM_MIRROR | ROM_OPTIONAL)
794711
795   ROM_IPC
712   ROM_REGION( 0x800, I8749_TAG, 0 )
713   ROM_LOAD( "ipc8049.ic24", 0x000, 0x800, CRC(6a0d1f20) SHA1(fcb1c97ee7c66e5b6d8fbb57c06fd2f6509f2e1b) )
714
715   ROM_REGION( 0x400, "plds", 0 )
716    ROM_LOAD( "hal16l8.ic38", 0x0000, 0x0400, NO_DUMP )
796717ROM_END
797718
798719ROM_START( ql_fr )
799    ROM_REGION( 0x400000, M68008_TAG, 0 )
800    ROM_LOAD( "mgf.ic33", 0x000000, 0x008000, NO_DUMP )
801    ROM_LOAD( "mgf.ic34", 0x008000, 0x004000, NO_DUMP )
720    ROM_REGION( 0x10000, M68008_TAG, 0 )
721    ROM_LOAD( "mgf.ic33", 0x0000, 0x8000, NO_DUMP )
722    ROM_LOAD( "mgf.ic34", 0x8000, 0x4000, NO_DUMP )
723   ROM_CART_LOAD("cart", 0xc000, 0x4000, ROM_MIRROR | ROM_OPTIONAL)
802724
803   ROM_IPC
725   ROM_REGION( 0x800, I8749_TAG, 0 )
726   ROM_LOAD( "ipc8049.ic24", 0x000, 0x800, CRC(6a0d1f20) SHA1(fcb1c97ee7c66e5b6d8fbb57c06fd2f6509f2e1b) )
727
728   ROM_REGION( 0x400, "plds", 0 )
729    ROM_LOAD( "hal16l8.ic38", 0x0000, 0x0400, NO_DUMP )
804730ROM_END
805731
806732ROM_START( ql_de )
807    ROM_REGION( 0x400000, M68008_TAG, 0 )
808   ROM_SYSTEM_BIOS( 0, "default", "v1.10 (MG)" )
809    ROMX_LOAD( "mgg.ic33", 0x000000, 0x008000, BAD_DUMP CRC(b4e468fd) SHA1(cd02a3cd79af90d48b65077d0571efc2f12f146e), ROM_BIOS(1) )
810    ROMX_LOAD( "mgg.ic34", 0x008000, 0x004000, BAD_DUMP CRC(54959d40) SHA1(ffc0be9649f26019d7be82925c18dc699259877f), ROM_BIOS(1) )
811
733    ROM_REGION( 0x10000, M68008_TAG, 0 )
734   ROM_SYSTEM_BIOS( 0, "mg", "v1.10 (MG)" )
735    ROMX_LOAD( "mgg.ic33", 0x0000, 0x8000, BAD_DUMP CRC(b4e468fd) SHA1(cd02a3cd79af90d48b65077d0571efc2f12f146e), ROM_BIOS(1) )
736    ROMX_LOAD( "mgg.ic34", 0x8000, 0x4000, BAD_DUMP CRC(54959d40) SHA1(ffc0be9649f26019d7be82925c18dc699259877f), ROM_BIOS(1) )
812737   ROM_SYSTEM_BIOS( 1, "mf", "v1.14 (MF)" )
813    ROMX_LOAD( "mf.ic33", 0x000000, 0x008000, BAD_DUMP CRC(49c40563) SHA1(d3bcd0614cf9b52e9d7fc2832e11463e5030476b), ROM_BIOS(2) )
814    ROMX_LOAD( "mf.ic34", 0x008000, 0x004000, BAD_DUMP CRC(5974616b) SHA1(c3603768c08535c25f077eed02fb80128aff13d9), ROM_BIOS(2) )
815
738    ROMX_LOAD( "mf.ic33", 0x0000, 0x8000, BAD_DUMP CRC(49c40563) SHA1(d3bcd0614cf9b52e9d7fc2832e11463e5030476b), ROM_BIOS(2) )
739    ROMX_LOAD( "mf.ic34", 0x8000, 0x4000, BAD_DUMP CRC(5974616b) SHA1(c3603768c08535c25f077eed02fb80128aff13d9), ROM_BIOS(2) )
816740   ROM_SYSTEM_BIOS( 2, "ultramg", "Ultrasoft" )
817   ROMX_LOAD( "ultramg.rom", 0x000000, 0x00c000, BAD_DUMP CRC(ad12463b) SHA1(0561b3bc7ce090f3101b2142ee957c18c250eefa), ROM_BIOS(3) )
741   ROMX_LOAD( "ultramg.rom", 0x0000, 0x00c000, BAD_DUMP CRC(ad12463b) SHA1(0561b3bc7ce090f3101b2142ee957c18c250eefa), ROM_BIOS(3) )
742   ROM_CART_LOAD("cart", 0xc000, 0x4000, ROM_MIRROR | ROM_OPTIONAL)
818743
819   ROM_IPC
744   ROM_REGION( 0x800, I8749_TAG, 0 )
745   ROM_LOAD( "ipc8049.ic24", 0x000, 0x800, CRC(6a0d1f20) SHA1(fcb1c97ee7c66e5b6d8fbb57c06fd2f6509f2e1b) )
746
747   ROM_REGION( 0x400, "plds", 0 )
748    ROM_LOAD( "hal16l8.ic38", 0x0000, 0x0400, NO_DUMP )
820749ROM_END
821750
822751ROM_START( ql_it )
823    ROM_REGION( 0x400000, M68008_TAG, 0 )
824    ROM_LOAD( "mgi.ic33", 0x000000, 0x008000, BAD_DUMP CRC(d5293bde) SHA1(bf5af7e53a472d4e9871f182210787d601db0634) )
825    ROM_LOAD( "mgi.ic34", 0x008000, 0x004000, BAD_DUMP CRC(a2fdfb83) SHA1(162b1052737500f3c13497cdf0f813ba006bdae9) )
752    ROM_REGION( 0x10000, M68008_TAG, 0 )
753    ROM_LOAD( "mgi.ic33", 0x0000, 0x8000, BAD_DUMP CRC(d5293bde) SHA1(bf5af7e53a472d4e9871f182210787d601db0634) )
754    ROM_LOAD( "mgi.ic34", 0x8000, 0x4000, BAD_DUMP CRC(a2fdfb83) SHA1(162b1052737500f3c13497cdf0f813ba006bdae9) )
755   ROM_CART_LOAD("cart", 0xc000, 0x4000, ROM_MIRROR | ROM_OPTIONAL)
826756
827   ROM_IPC
757   ROM_REGION( 0x800, I8749_TAG, 0 )
758   ROM_LOAD( "ipc8049.ic24", 0x000, 0x800, CRC(6a0d1f20) SHA1(fcb1c97ee7c66e5b6d8fbb57c06fd2f6509f2e1b) )
759
760   ROM_REGION( 0x400, "plds", 0 )
761    ROM_LOAD( "hal16l8.ic38", 0x0000, 0x0400, NO_DUMP )
828762ROM_END
829763
830764ROM_START( ql_se )
831    ROM_REGION( 0x400000, M68008_TAG, 0 )
832    ROM_LOAD( "mgs.ic33", 0x000000, 0x008000, NO_DUMP )
833    ROM_LOAD( "mgs.ic34", 0x008000, 0x004000, NO_DUMP )
765    ROM_REGION( 0x10000, M68008_TAG, 0 )
766    ROM_LOAD( "mgs.ic33", 0x0000, 0x8000, NO_DUMP )
767    ROM_LOAD( "mgs.ic34", 0x8000, 0x4000, NO_DUMP )
768   ROM_CART_LOAD("cart", 0xc000, 0x4000, ROM_MIRROR | ROM_OPTIONAL)
834769
835   ROM_IPC
770   ROM_REGION( 0x800, I8749_TAG, 0 )
771   ROM_LOAD( "ipc8049.ic24", 0x000, 0x800, CRC(6a0d1f20) SHA1(fcb1c97ee7c66e5b6d8fbb57c06fd2f6509f2e1b) )
772
773   ROM_REGION( 0x400, "plds", 0 )
774    ROM_LOAD( "hal16l8.ic38", 0x0000, 0x0400, NO_DUMP )
836775ROM_END
837776
838777ROM_START( ql_gr )
839    ROM_REGION( 0x400000, M68008_TAG, 0 )
840    ROM_LOAD( "efp.ic33", 0x000000, 0x008000, BAD_DUMP CRC(eb181641) SHA1(43c1e0215cf540cbbda240b1048910ff55681059) )
841    ROM_LOAD( "efp.ic34", 0x008000, 0x004000, BAD_DUMP CRC(4c3b34b7) SHA1(f9dc571d2d4f68520b306ecc7516acaeea69ec0d) )
778    ROM_REGION( 0x10000, M68008_TAG, 0 )
779    ROM_LOAD( "efp.ic33", 0x0000, 0x8000, BAD_DUMP CRC(eb181641) SHA1(43c1e0215cf540cbbda240b1048910ff55681059) )
780    ROM_LOAD( "efp.ic34", 0x8000, 0x4000, BAD_DUMP CRC(4c3b34b7) SHA1(f9dc571d2d4f68520b306ecc7516acaeea69ec0d) )
781   ROM_CART_LOAD("cart", 0xc000, 0x4000, ROM_MIRROR | ROM_OPTIONAL)
842782
843   ROM_IPC
783   ROM_REGION( 0x800, I8749_TAG, 0 )
784   ROM_LOAD( "ipc8049.ic24", 0x000, 0x800, CRC(6a0d1f20) SHA1(fcb1c97ee7c66e5b6d8fbb57c06fd2f6509f2e1b) )
785
786   ROM_REGION( 0x400, "plds", 0 )
787    ROM_LOAD( "hal16l8.ic38", 0x0000, 0x0400, NO_DUMP )
844788ROM_END
845789
846790ROM_START( ql_dk )
847    ROM_REGION( 0x400000, M68008_TAG, 0 )
848    ROM_LOAD( "mgd.ic33",  0x000000, 0x008000, BAD_DUMP CRC(f57755eb) SHA1(dc57939ffb8741e17967a1d2479c339750ec7ff6) )
849    ROM_LOAD( "mgd.ic34",  0x008000, 0x004000, BAD_DUMP CRC(1892465a) SHA1(0ff3046b5276da6639d3fe79b22ae25cc265d540) )
850   ROM_LOAD( "extra.rom", 0x01c000, 0x004000, NO_DUMP )
791    ROM_REGION( 0x10000, M68008_TAG, 0 )
792    ROM_LOAD( "mgd.ic33",  0x0000, 0x8000, BAD_DUMP CRC(f57755eb) SHA1(dc57939ffb8741e17967a1d2479c339750ec7ff6) )
793    ROM_LOAD( "mgd.ic34",  0x8000, 0x4000, BAD_DUMP CRC(1892465a) SHA1(0ff3046b5276da6639d3fe79b22ae25cc265d540) )
794   ROM_CART_LOAD("cart", 0xc000, 0x4000, ROM_MIRROR | ROM_OPTIONAL)
851795
852   ROM_IPC
796   ROM_REGION( 0x4000, "extra", 0 )
797   ROM_LOAD( "extra.rom", 0x0000, 0x4000, NO_DUMP ) // located at 0x1c000 in M68008 memory map
798
799   ROM_REGION( 0x800, I8749_TAG, 0 )
800   ROM_LOAD( "ipc8049.ic24", 0x000, 0x800, CRC(6a0d1f20) SHA1(fcb1c97ee7c66e5b6d8fbb57c06fd2f6509f2e1b) )
801
802   ROM_REGION( 0x400, "plds", 0 )
803    ROM_LOAD( "hal16l8.ic38", 0x0000, 0x0400, NO_DUMP )
853804ROM_END
854805
855806ROM_START( tonto )
r9714r9715
894845   ROM_LOAD( "rompack-5.rom", 0x020000, 0x008000, NO_DUMP )
895846ROM_END
896847
897/* System Configuration */
898
899static QUICKLOAD_LOAD( ql )
900{
901   image.fread(messram_get_ptr(image.device().machine->device("messram")), 128*1024);
902
903   return IMAGE_INIT_PASS;
904}
905
906848/* Computer Drivers */
907849
908850/*    YEAR  NAME    PARENT  COMPAT  MACHINE     INPUT   INIT    COMPANY                     FULLNAME        FLAGS */
r9714r9715
915857COMP( 1985, ql_se,  ql,     0,      ql,         ql_se,  0,      "Sinclair Research Ltd",    "QL (Sweden)",  GAME_NOT_WORKING )
916858COMP( 1985, ql_dk,  ql,     0,      ql,         ql_dk,  0,      "Sinclair Research Ltd",    "QL (Denmark)", GAME_NOT_WORKING )
917859COMP( 1985, ql_gr,  ql,     0,      ql,         ql,     0,      "Sinclair Research Ltd",    "QL (Greece)",  GAME_SUPPORTS_SAVE )
918// last two did not used system config
919860COMP( 1984, tonto,  0,      0,      opd,      ql,      0,      "British Telecom Business Systems", "Merlin M1800 Tonto", GAME_NOT_WORKING )
920861COMP( 1986, megaopd,tonto,   0,      megaopd,   ql,      0,      "International Computer Limited", "MegaOPD (USA)", GAME_NOT_WORKING )
docs/messnew.txt
r9714r9715
3535
3636- [AMU880] Fixed keyboard. [Curt Coder]
3737
38- [C64] Added known good dumps softlist for cartridges. Not hooked up
38- [C64] Added known good dumps software list for cartridges. Not hooked up
3939  to driver code yet. [Curt Coder]
4040
4141- [C64] Multisession fixes.  [Atari Ace]
r9714r9715
5050
5151- [PC8201] Added support for 128KB ROM cassettes. [Curt Coder]
5252
53- [PC8201] Added option ROM softlist. [Curt Coder]
53- [PC8201] Added a software list for option ROMs. [Curt Coder]
5454
5555- [SMS] Improved Light Phaser emulation and converted it to use timers
5656  that control when the beam will reach the aim area, to run the function
r9714r9715
6565  selecting the Segascope views from the Video Options menu). The option
6666  is turned off by default, being inaccurate [Enik Land, Fabio Priuli]
6767
68- [TANDY200] Limited video RAM to 8 KB per hardware. [Curt Coder]
68- [TANDY200] Limited video RAM to 8 KB as per hardware. [Curt Coder]
6969
70- [TANDY200] Added option ROM softlist. [Curt Coder]
70- [TANDY200] Added a software list for option ROMs. [Curt Coder]
7171
72- [TRSM100] Added option ROM softlist. [Curt Coder]
72- [TRSM100] Added a software list for option ROMs. [Curt Coder]
7373
7474
7575
76
7776Imgtool Changes:
7877----------------
7978(none)
r9714r9715
103102- Refactored the following drivers to define ADDRESS_MAP_MODERN:
104103  abc80, advision, amu880, bw12, bw14, bw2, kc85, trsm100, tandy102,
105104  tandy200, pc8201a, mm1m6, sg1000, sc3000, sf7000, tandy2k, v1050,
106  victor9k, vidbrain, xerox820, xerox820ii, xor100. [Curt Coder]
105  victor9k, vidbrain, ql, xerox820, xerox820ii, xor100. [Curt Coder]
107106
107- Allowed the use of either decimal or hexadecimal values for <dataarea> size,
108  <rom> size, and <rom> offset in software lists. [Curt Coder]
108109
110- Enabled loading ROMs from software lists to ROM_CART_LOAD entries. [Curt Coder]
109111
112
113
1101140.140
111115
112116New System Drivers Supported:

Previous 15994 Revisions Next


© 1998-2018 The MESS Team