Previous 199869 Revisions Next

r29176 Wednesday 2nd April, 2014 at 07:46:06 UTC by Miodrag Milanović
modernized apollo a little bit more (nw)
[src/mess/drivers]apollo.c
[src/mess/includes]apollo.h
[src/mess/video]apollo.c

trunk/src/mess/drivers/apollo.c
r29175r29176
688688      AM_RANGE(0x016400, 0x0164ff) AM_READWRITE16(selective_clear_locations_r, selective_clear_locations_w, 0xffffffff )
689689      AM_RANGE(0x017000, 0x017fff) AM_READWRITE16(apollo_address_translation_map_r, apollo_address_translation_map_w, 0xffffffff )
690690
691      AM_RANGE(0x05d800, 0x05dc07) AM_DEVREADWRITE8_LEGACY(APOLLO_SCREEN_TAG, apollo_mcr_r, apollo_mcr_w, 0xffffffff)
692      AM_RANGE(0xfa0000, 0xfdffff) AM_DEVREADWRITE16_LEGACY(APOLLO_SCREEN_TAG, apollo_mgm_r, apollo_mgm_w, 0xffffffff)
691      AM_RANGE(0x05d800, 0x05dc07) AM_DEVREADWRITE8(APOLLO_SCREEN_TAG, apollo_graphics_15i, apollo_mcr_r, apollo_mcr_w, 0xffffffff)
692      AM_RANGE(0xfa0000, 0xfdffff) AM_DEVREADWRITE16(APOLLO_SCREEN_TAG, apollo_graphics_15i, apollo_mgm_r, apollo_mgm_w, 0xffffffff)
693693
694      AM_RANGE(0x05e800, 0x05ec07) AM_DEVREADWRITE8_LEGACY(APOLLO_SCREEN_TAG, apollo_ccr_r, apollo_ccr_w, 0xffffffff)
695      AM_RANGE(0x0a0000, 0x0bffff) AM_DEVREADWRITE16_LEGACY(APOLLO_SCREEN_TAG, apollo_cgm_r, apollo_cgm_w, 0xffffffff)
694      AM_RANGE(0x05e800, 0x05ec07) AM_DEVREADWRITE8(APOLLO_SCREEN_TAG, apollo_graphics_15i, apollo_ccr_r, apollo_ccr_w, 0xffffffff)
695      AM_RANGE(0x0a0000, 0x0bffff) AM_DEVREADWRITE16(APOLLO_SCREEN_TAG, apollo_graphics_15i, apollo_cgm_r, apollo_cgm_w, 0xffffffff)
696696
697697      AM_RANGE(ATBUS_IO_BASE, ATBUS_IO_END) AM_READWRITE16(apollo_atbus_io_r, apollo_atbus_io_w, 0xffffffff)
698698
r29175r29176
762762      AM_RANGE(0x009500, 0x0095ff) AM_DEVREADWRITE8(APOLLO_PIC2_TAG, pic8259_device, read, write, 0xffffffff)
763763      AM_RANGE(0x009600, 0x0096ff) AM_READWRITE16(apollo_node_id_r, apollo_node_id_w, 0xffffffff)
764764
765      AM_RANGE(0x05d800, 0x05dc07) AM_DEVREADWRITE8_LEGACY(APOLLO_SCREEN_TAG, apollo_mcr_r, apollo_mcr_w, 0xffffffff)
766      AM_RANGE(0xfa0000, 0xfdffff) AM_DEVREADWRITE16_LEGACY(APOLLO_SCREEN_TAG, apollo_mgm_r, apollo_mgm_w, 0xffffffff)
765      AM_RANGE(0x05d800, 0x05dc07) AM_DEVREADWRITE8(APOLLO_SCREEN_TAG, apollo_graphics_15i, apollo_mcr_r, apollo_mcr_w, 0xffffffff)
766      AM_RANGE(0xfa0000, 0xfdffff) AM_DEVREADWRITE16(APOLLO_SCREEN_TAG, apollo_graphics_15i, apollo_mgm_r, apollo_mgm_w, 0xffffffff)
767767
768      AM_RANGE(0x05e800, 0x05ec07) AM_DEVREADWRITE8_LEGACY(APOLLO_SCREEN_TAG, apollo_ccr_r, apollo_ccr_w, 0xffffffff)
769      AM_RANGE(0x0a0000, 0x0bffff) AM_DEVREADWRITE16_LEGACY(APOLLO_SCREEN_TAG, apollo_cgm_r, apollo_cgm_w, 0xffffffff)
768      AM_RANGE(0x05e800, 0x05ec07) AM_DEVREADWRITE8(APOLLO_SCREEN_TAG, apollo_graphics_15i, apollo_ccr_r, apollo_ccr_w, 0xffffffff)
769      AM_RANGE(0x0a0000, 0x0bffff) AM_DEVREADWRITE16(APOLLO_SCREEN_TAG, apollo_graphics_15i, apollo_cgm_r, apollo_cgm_w, 0xffffffff)
770770
771771      AM_RANGE(ATBUS_IO_BASE, ATBUS_IO_END) AM_READWRITE16(apollo_atbus_io_r, apollo_atbus_io_w, 0xffffffff)
772772
r29175r29176
836836      AM_RANGE(0x016400, 0x0164ff) AM_READWRITE16(selective_clear_locations_r, selective_clear_locations_w, 0xffffffff )
837837      AM_RANGE(0x017000, 0x017fff) AM_READWRITE16(apollo_address_translation_map_r, apollo_address_translation_map_w, 0xffffffff )
838838
839      AM_RANGE(0x05d800, 0x05dc07) AM_DEVREADWRITE8_LEGACY(APOLLO_SCREEN_TAG, apollo_mcr_r, apollo_mcr_w, 0xffffffff)
840      AM_RANGE(0xfa0000, 0xfdffff) AM_DEVREADWRITE16_LEGACY(APOLLO_SCREEN_TAG, apollo_mgm_r, apollo_mgm_w, 0xffffffff)
839      AM_RANGE(0x05d800, 0x05dc07) AM_DEVREADWRITE8(APOLLO_SCREEN_TAG, apollo_graphics_15i, apollo_mcr_r, apollo_mcr_w, 0xffffffff)
840      AM_RANGE(0xfa0000, 0xfdffff) AM_DEVREADWRITE16(APOLLO_SCREEN_TAG, apollo_graphics_15i, apollo_mgm_r, apollo_mgm_w, 0xffffffff)
841841
842      AM_RANGE(0x05e800, 0x05ec07) AM_DEVREADWRITE8_LEGACY(APOLLO_SCREEN_TAG, apollo_ccr_r, apollo_ccr_w, 0xffffffff)
843      AM_RANGE(0x0a0000, 0x0bffff) AM_DEVREADWRITE16_LEGACY(APOLLO_SCREEN_TAG, apollo_cgm_r, apollo_cgm_w, 0xffffffff)
842      AM_RANGE(0x05e800, 0x05ec07) AM_DEVREADWRITE8(APOLLO_SCREEN_TAG, apollo_graphics_15i, apollo_ccr_r, apollo_ccr_w, 0xffffffff)
843      AM_RANGE(0x0a0000, 0x0bffff) AM_DEVREADWRITE16(APOLLO_SCREEN_TAG, apollo_graphics_15i, apollo_cgm_r, apollo_cgm_w, 0xffffffff)
844844
845845      AM_RANGE(ATBUS_IO_BASE, ATBUS_IO_END) AM_READWRITE16(apollo_atbus_io_r, apollo_atbus_io_w, 0xffffffff)
846846
trunk/src/mess/includes/apollo.h
r29175r29176
301301   apollo_graphics_15i(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock, device_type type, const char *name, const char *shortname, const char *source);
302302   ~apollo_graphics_15i();
303303
304   // access to legacy token
305   class apollo_graphics *token() const { assert(m_token != NULL); return m_token; }
304   UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);   
305
306   // monochrome control
307   DECLARE_READ8_MEMBER( apollo_mcr_r );
308   DECLARE_WRITE8_MEMBER( apollo_mcr_w );
309
310   // monochrome and color memory
311   DECLARE_READ16_MEMBER( apollo_mem_r );
312   DECLARE_WRITE16_MEMBER( apollo_mem_w );
313
314   // color control
315   DECLARE_READ8_MEMBER( apollo_ccr_r );
316   DECLARE_WRITE8_MEMBER( apollo_ccr_w );
306317   
307   UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);   
318   DECLARE_READ16_MEMBER( apollo_mgm_r );
319   DECLARE_WRITE16_MEMBER( apollo_mgm_w );
320
321   DECLARE_READ16_MEMBER( apollo_cgm_r );
322   DECLARE_WRITE16_MEMBER( apollo_cgm_w );
323     
324   void vblank_state_changed(screen_device &screen, bool vblank_state);
325
326   int is_mono() { return m_n_planes == 1; }
327
308328protected:
309329   // device-level overrides
310330   virtual void device_config_complete();
311331   virtual void device_start();
312332   virtual void device_reset();
333protected:
334   class lut_fifo;
335   class bt458;
336
337   const char *cr_text(offs_t offset, UINT8 data, UINT8 rw);
338
339   void increment_h_clock();
340   void increment_v_clock();
341   void increment_p_clock();
342
343   void log_cr1(const char * text);
344   void set_cr1(UINT8 data);
345   void set_cr3a(UINT8 data);
346   void set_cr3b(UINT8 data);
347   void set_lut_cr(UINT8 data);
348
349   void register_vblank_callback();
350   
351   UINT32 set_msb0(UINT32 value, UINT8 data)
352   {
353      return (value & 0xffffff00) | data;
354   }
355   UINT32 set_lsb0(UINT32 value, UINT8 data)
356   {
357      return (value & 0xffff00ff) | (data << 8);
358   }
359   UINT32 set_msb1(UINT32 value, UINT8 data)
360   {
361      return (value & 0xff00ffff) | (data << 16);
362   }
363   UINT32 set_lsb1(UINT32 value, UINT8 data)
364   {
365      return (value & 0x00ffffff) | (data << 24);
366   }
367   UINT8 get_msb1(UINT32 value)
368   {
369      return (value >> 16) & 0xff;
370   }
371   UINT8 get_lsb1(UINT32 value)
372   {
373      return (value >> 24) & 0xff;
374   }
375
376   void set_status_rmw();
377   UINT16 rop(UINT16 dest_data, UINT16 src_data, UINT8 plane);
378   void set_source_data(UINT32 offset);
379   UINT32 get_source_data(UINT8 plane);
380   void blt(UINT32 dest_addr, UINT16 mem_mask);
381
382   UINT8 get_pixel(UINT32 offset, UINT16 mask);
383   UINT8 c4p_read_adc(UINT8 data);
384   UINT8 c8p_read_adc(UINT8 data);
385
386   void screen_update1(bitmap_rgb32 &bitmap, const rectangle &cliprect);
387protected:
388   UINT16 m_n_planes;
389   UINT16 m_width;
390   UINT16 m_height;
391   UINT16 m_buffer_width;
392   UINT16 m_buffer_height;
393
394   UINT8 m_sr;
395   UINT8 m_device_id;
396   UINT16 m_write_enable_register;
397   UINT32 m_rop_register;
398   UINT16 m_diag_mem_request;
399   UINT8 m_cr0;
400   UINT8 m_cr1;
401   UINT8 m_cr2;
402   UINT8 m_cr2b;
403   UINT8 m_cr2_s_data;
404   UINT8 m_cr2_s_plane;
405   UINT8 m_cr2_d_plane;
406   UINT8 m_cr3a;
407   UINT8 m_cr3b;
408   UINT8 m_ad_result;
409   UINT8 m_ad_pending;
410
411   UINT8 m_lut_control;
412   UINT8 m_lut_data;
413
414   UINT8 m_update_flag;
415   UINT8 m_update_pending;
416
417   UINT8 m_blt_cycle_count;
418   UINT32 m_image_offset;
419   UINT32 m_guard_latch[8];
420
421   int m_h_clock;
422   int m_v_clock;
423   int m_p_clock;
424   int m_data_clock;
425
426   UINT16 *m_image_memory;
427   int m_image_plane_size;
428   int m_image_memory_size;
429
430   UINT32 m_color_lookup_table[16];
431
432   lut_fifo *m_lut_fifo;
433   bt458 *m_bt458;
434};
435
436
437#define LUT_FIFO_SIZE   1024
438
439
440//**************************************************************************
441// class LUT Fifo
442//**************************************************************************
443
444class apollo_graphics_15i::lut_fifo
445{
446public:
447   lut_fifo()
448   {
449      reset();
450   }
451
452   void reset()
453   {
454      m_size = LUT_FIFO_SIZE;
455      m_get_index = 0;
456      m_put_index = 0;
457   }
458
459   void put(const UINT8 data)
460   {
461      if (!is_full())
462      {
463         m_data[m_put_index] = data;
464         m_put_index = (m_put_index + 1) % m_size;
465      }
466   }
467
468   UINT8 get()
469   {
470      UINT8 data = is_empty() ? 0xff : m_data[m_get_index];
471      m_get_index = (m_get_index + 1) % m_size;
472      return data;
473   }
474
475   int is_empty()
476   {
477      return m_get_index == m_put_index;
478   }
479
480   int is_full()
481   {
482      return ((m_put_index + 1) % m_size) == m_get_index;
483   }
484
313485private:
314   // internal state
315   class apollo_graphics *m_token;
486   UINT16 m_size;
487   UINT16 m_get_index;
488   UINT16 m_put_index;
489   UINT8 m_data[LUT_FIFO_SIZE];
316490};
317491
492//**************************************************************************
493//  class Brooktree Bt458
494//**************************************************************************
495
496class apollo_graphics_15i::bt458
497{
498public:
499   bt458(running_machine &running_machine);
500   void start();
501   void reset();
502   UINT8 read(UINT8 c10);
503   void write(UINT8 data, UINT8 c10);
504   UINT32 get_rgb(UINT8 index);
505
506private:
507   running_machine &machine() const
508   {
509      assert(m_machine != NULL);
510      return *m_machine;
511   }
512
513   UINT8 m_color_counter;
514   UINT8 m_red;
515   UINT8 m_green;
516
517   UINT8 m_address_register;
518   UINT32 m_color_palette_RAM[256];
519   UINT32 m_overlay_color[4];
520   UINT8 m_read_mask_register;
521   UINT8 m_blink_mask_register;
522   UINT8 m_command_register;
523   UINT8 m_control_test_register;
524
525   running_machine *m_machine;
526};
527
528
529
318530extern const device_type APOLLO_GRAPHICS;
319531
320532#define MCFG_APOLLO_GRAPHICS_ADD( _tag) \
r29175r29176
344556
345557MACHINE_CONFIG_EXTERN( apollo_mono19i );
346558
347DECLARE_READ8_DEVICE_HANDLER( apollo_mcr_r ) ;
348DECLARE_WRITE8_DEVICE_HANDLER(apollo_mcr_w );
349559
350DECLARE_READ16_DEVICE_HANDLER( apollo_mgm_r );
351DECLARE_WRITE16_DEVICE_HANDLER( apollo_mgm_w );
352
353DECLARE_READ8_DEVICE_HANDLER( apollo_ccr_r ) ;
354DECLARE_WRITE8_DEVICE_HANDLER(apollo_ccr_w );
355
356DECLARE_READ16_DEVICE_HANDLER( apollo_cgm_r );
357DECLARE_WRITE16_DEVICE_HANDLER( apollo_cgm_w );
358
359560#endif /* APOLLO_H_ */
trunk/src/mess/video/apollo.c
r29175r29176
9696#define LUT_C0          0x01
9797#define LUT_C1_C0(a)    ((a)& (LUT_C1|LUT_C0))
9898
99#define LUT_FIFO_SIZE   1024
10099
101//**************************************************************************
102//  class apollo_graphics
103//**************************************************************************
104
105class apollo_graphics /*: public device_t*/
100apollo_graphics_15i::bt458::bt458(running_machine &running_machine)
106101{
107public:
108   apollo_graphics()
109   {
110   }
111
112   void device_start(running_machine &m_machine);
113   void device_reset();
114   void device_reset_mono19i();
115
116   // monochrome control
117   READ8_DEVICE_HANDLER( apollo_mcr_r );
118   WRITE8_DEVICE_HANDLER( apollo_mcr_w );
119
120   // monochrome and color memory
121   READ16_DEVICE_HANDLER( apollo_mem_r );
122   WRITE16_DEVICE_HANDLER( apollo_mem_w );
123
124   // color control
125   READ8_DEVICE_HANDLER( apollo_ccr_r );
126   WRITE8_DEVICE_HANDLER( apollo_ccr_w );
127
128   UINT32 screen_update(bitmap_rgb32 &bitmap, const rectangle &cliprect);
129   void vblank_state_changed(device_t *device, screen_device &screen, bool vblank_state);
130
131   int is_mono() { return m_n_planes == 1; }
132
133private:
134   class lut_fifo;
135   class bt458;
136
137   running_machine &machine() const
138   {
139      assert(m_machine != NULL);
140      return *m_machine;
141   }
142
143   const char *cr_text(offs_t offset, UINT8 data, UINT8 rw);
144
145   void increment_h_clock();
146   void increment_v_clock();
147   void increment_p_clock();
148
149   void log_cr1(const char * text, device_t *device);
150   void set_cr1(device_t *device, UINT8 data);
151   void set_cr3a(device_t *device, UINT8 data);
152   void set_cr3b(device_t *device, UINT8 data);
153   void set_lut_cr(device_t *device, UINT8 data);
154
155   UINT32 set_msb0(UINT32 value, UINT8 data)
156   {
157      return (value & 0xffffff00) | data;
158   }
159   UINT32 set_lsb0(UINT32 value, UINT8 data)
160   {
161      return (value & 0xffff00ff) | (data << 8);
162   }
163   UINT32 set_msb1(UINT32 value, UINT8 data)
164   {
165      return (value & 0xff00ffff) | (data << 16);
166   }
167   UINT32 set_lsb1(UINT32 value, UINT8 data)
168   {
169      return (value & 0x00ffffff) | (data << 24);
170   }
171   UINT8 get_msb1(UINT32 value)
172   {
173      return (value >> 16) & 0xff;
174   }
175   UINT8 get_lsb1(UINT32 value)
176   {
177      return (value >> 24) & 0xff;
178   }
179
180   void set_status_rmw();
181   UINT16 rop(UINT16 dest_data, UINT16 src_data, UINT8 plane);
182   void set_source_data(UINT32 offset);
183   UINT32 get_source_data(UINT8 plane);
184   void blt(UINT32 dest_addr, UINT16 mem_mask);
185
186   UINT8 get_pixel(UINT32 offset, UINT16 mask);
187   UINT8 c4p_read_adc(UINT8 data);
188   UINT8 c8p_read_adc(UINT8 data);
189
190   void screen_update1(bitmap_rgb32 &bitmap, const rectangle &cliprect);
191
192   UINT16 m_n_planes;
193   UINT16 m_width;
194   UINT16 m_height;
195   UINT16 m_buffer_width;
196   UINT16 m_buffer_height;
197
198   UINT8 m_sr;
199   UINT8 m_device_id;
200   UINT16 m_write_enable_register;
201   UINT32 m_rop_register;
202   UINT16 m_diag_mem_request;
203   UINT8 m_cr0;
204   UINT8 m_cr1;
205   UINT8 m_cr2;
206   UINT8 m_cr2b;
207   UINT8 m_cr2_s_data;
208   UINT8 m_cr2_s_plane;
209   UINT8 m_cr2_d_plane;
210   UINT8 m_cr3a;
211   UINT8 m_cr3b;
212   UINT8 m_ad_result;
213   UINT8 m_ad_pending;
214
215   UINT8 m_lut_control;
216   UINT8 m_lut_data;
217
218   UINT8 m_update_flag;
219   UINT8 m_update_pending;
220
221   UINT8 m_blt_cycle_count;
222   UINT32 m_image_offset;
223   UINT32 m_guard_latch[8];
224
225   int m_h_clock;
226   int m_v_clock;
227   int m_p_clock;
228   int m_data_clock;
229
230   UINT16 *m_image_memory;
231   int m_image_plane_size;
232   int m_image_memory_size;
233
234   UINT32 m_color_lookup_table[16];
235
236   lut_fifo *m_lut_fifo;
237   bt458 *m_bt458;
238
239   running_machine *m_machine;
240};
241
242   //**************************************************************************
243   // class LUT Fifo
244   //**************************************************************************
245
246class apollo_graphics::lut_fifo
247{
248public:
249   lut_fifo()
250   {
251      reset();
252   }
253
254   void reset()
255   {
256      m_size = LUT_FIFO_SIZE;
257      m_get_index = 0;
258      m_put_index = 0;
259   }
260
261   void put(const UINT8 data)
262   {
263      if (!is_full())
264      {
265         m_data[m_put_index] = data;
266         m_put_index = (m_put_index + 1) % m_size;
267      }
268   }
269
270   UINT8 get()
271   {
272      UINT8 data = is_empty() ? 0xff : m_data[m_get_index];
273      m_get_index = (m_get_index + 1) % m_size;
274      return data;
275   }
276
277   int is_empty()
278   {
279      return m_get_index == m_put_index;
280   }
281
282   int is_full()
283   {
284      return ((m_put_index + 1) % m_size) == m_get_index;
285   }
286
287private:
288   UINT16 m_size;
289   UINT16 m_get_index;
290   UINT16 m_put_index;
291   UINT8 m_data[LUT_FIFO_SIZE];
292};
293
294//**************************************************************************
295//  class Brooktree Bt458
296//**************************************************************************
297
298class apollo_graphics::bt458
299{
300public:
301   bt458(running_machine &running_machine);
302   void start();
303   void reset();
304   UINT8 read(UINT8 c10);
305   void write(UINT8 data, UINT8 c10);
306   UINT32 get_rgb(UINT8 index);
307
308private:
309   running_machine &machine() const
310   {
311      assert(m_machine != NULL);
312      return *m_machine;
313   }
314
315   UINT8 m_color_counter;
316   UINT8 m_red;
317   UINT8 m_green;
318
319   UINT8 m_address_register;
320   UINT32 m_color_palette_RAM[256];
321   UINT32 m_overlay_color[4];
322   UINT8 m_read_mask_register;
323   UINT8 m_blink_mask_register;
324   UINT8 m_command_register;
325   UINT8 m_control_test_register;
326
327   running_machine *m_machine;
328};
329
330apollo_graphics::bt458::bt458(running_machine &running_machine)
331{
332102   m_machine = &running_machine;
333103}
334104
335void apollo_graphics::bt458::start()
105void apollo_graphics_15i::bt458::start()
336106{
337   MLOG1(("start apollo_graphics::bt458"));
107   MLOG1(("start apollo_graphics_15i::bt458"));
338108}
339109
340void apollo_graphics::bt458::reset()
110void apollo_graphics_15i::bt458::reset()
341111{
342   MLOG1(("reset apollo_graphics::bt458"));
112   MLOG1(("reset apollo_graphics_15i::bt458"));
343113
344114   m_color_counter = 0;
345115   m_red = 0;
r29175r29176
354124   m_control_test_register = 0;
355125}
356126
357void apollo_graphics::bt458::write(UINT8 data, UINT8 c10)
127void apollo_graphics_15i::bt458::write(UINT8 data, UINT8 c10)
358128{
359129   MLOG1(("writing Bt458 data=%02x C1,C0=%d", data, c10));
360130   switch (c10)
r29175r29176
427197   }
428198}
429199
430UINT8 apollo_graphics::bt458::read(UINT8 c10)
200UINT8 apollo_graphics_15i::bt458::read(UINT8 c10)
431201{
432202   UINT8 data = 0xff;
433203
r29175r29176
498268   return data;
499269}
500270
501UINT32 apollo_graphics::bt458::get_rgb(UINT8 index)
271UINT32 apollo_graphics_15i::bt458::get_rgb(UINT8 index)
502272{
503273   return m_color_palette_RAM[index];
504274}
505275
506/*****************************************************************************
507 INLINE FUNCTIONS
508 *****************************************************************************/
509
510INLINE apollo_graphics *get_safe_token(device_t *device)
511{
512   assert(device != NULL);
513   assert(device->type() == APOLLO_GRAPHICS || device->type() == APOLLO_MONO19I );
514   return (apollo_graphics *) downcast<apollo_graphics_15i *> (device)->token();
515}
516
517void apollo_graphics::device_start(running_machine &running_machine)
518{
519   m_n_planes = 0;
520   m_width = 0;
521   m_height = 0;
522   m_buffer_width = 0;
523   m_buffer_height = 0;
524
525   m_sr = 0;
526   m_device_id = 0;
527   m_write_enable_register = 0;
528   m_rop_register = 0;
529   m_diag_mem_request = 0;
530   m_cr0 = 0;
531   m_cr1 = 0;
532   m_cr2 = 0;
533   m_cr2b = 0;
534   m_cr2_s_data = 0;
535   m_cr2_s_plane = 0x00;
536   m_cr2_d_plane = 0x0e;
537   m_cr3a = 0;
538   m_cr3b = 0;
539   m_ad_result = 0;
540   m_ad_pending = 0;
541
542   m_lut_control = 0;
543   m_lut_data = 0;
544
545   m_update_flag = 0;
546   m_update_pending = 0;
547
548   m_blt_cycle_count = 0;
549   m_image_offset = 0;
550   memset(m_guard_latch, 0, sizeof(m_guard_latch));
551
552   m_h_clock = 0;
553   m_v_clock = 0;
554   m_p_clock = 0;
555   m_data_clock = 0;
556
557   m_image_memory = 0;
558   m_image_plane_size = 0;
559   m_image_memory_size = 0;
560
561   memset(m_color_lookup_table, 0, sizeof(m_color_lookup_table));
562
563   m_lut_fifo = NULL;
564   m_bt458 = NULL;
565
566   m_machine = &running_machine;
567}
568
569void apollo_graphics::device_reset()
570{
571   if (m_n_planes == 0)
572   {
573      if (apollo_config(APOLLO_CONF_MONO_19I))
574      {
575         // monochrome 1280x1024
576         m_n_planes = 1;
577         m_device_id = SCREEN_DEVICE_ID_19I;
578         m_width = 1280;
579         m_height = 1024;
580         m_buffer_width = 2048;
581         m_buffer_height = 1024;
582      }
583      else if (apollo_config(APOLLO_CONF_MONO_15I))
584      {
585         // monochrome 1024x800
586         m_n_planes = 1;
587         m_device_id = SCREEN_DEVICE_ID_15I;
588         m_width = 1024;
589         m_height = 800;
590         m_buffer_width = 1024;
591         m_buffer_height = 1024;
592      }
593      else if (apollo_config(APOLLO_CONF_4_PLANES))
594      {
595         // 4-planes color 1024x800
596         m_n_planes = 4;
597         m_device_id = SCREEN_DEVICE_ID_C4P;
598         m_width = 1024;
599         m_height = 800;
600         m_buffer_width = 1024;
601         m_buffer_height = 1024;
602      }
603      else
604      {
605         // 8-planes color 1024x800
606         m_n_planes = 8;
607         m_device_id = SCREEN_DEVICE_ID_C8P;
608         m_width = 1024;
609         m_height = 800;
610         m_buffer_width = 1024;
611         m_buffer_height = 1024;
612
613         m_lut_fifo = new lut_fifo();
614
615         m_bt458 = new bt458(*m_machine);
616         m_bt458->start();
617         m_bt458->reset();
618      }
619   }
620
621   if (m_image_memory == NULL)
622   {
623      /* allocate the memory image */
624      m_image_plane_size = m_buffer_height * m_buffer_width / 16;
625      m_image_memory_size = m_image_plane_size * m_n_planes;
626      m_image_memory
627            = auto_alloc_array(machine(), UINT16, m_image_memory_size);
628      assert(m_image_memory != NULL);
629
630      MLOG1(("device reset apollo graphics: buffer=%p size=%0x", m_image_memory, m_image_memory_size));
631   }
632
633   memset(m_color_lookup_table, 0, sizeof(m_color_lookup_table));
634   memset(m_image_memory, 0, m_image_memory_size * 2);
635
636   //  register_vblank_callback(this);
637}
638
639void apollo_graphics::device_reset_mono19i()
640{
641   if (m_n_planes == 0)
642   {
643      // monochrome 1280x1024
644      m_n_planes = 1;
645      m_device_id = SCREEN_DEVICE_ID_19I;
646      m_width = 1280;
647      m_height = 1024;
648      m_buffer_width = 2048;
649      m_buffer_height = 1024;
650   }
651
652   device_reset();
653}
654
655276/***************************************************************************
656277 Monochrome Controller Registers at 0x5d800 - 0x5dc07
657278 ***************************************************************************/
658279
659const char *apollo_graphics::cr_text(offs_t offset, UINT8 data, UINT8 rw)
280const char *apollo_graphics_15i::cr_text(offs_t offset, UINT8 data, UINT8 rw)
660281{
661282   static const char *cr0[8] =
662283   { "cr0 mode=0 CPU dest BLT", "cr0 mode=1 Alternating BLT",
r29175r29176
708329   }
709330}
710331
711void apollo_graphics::log_cr1(const char * text, device_t *device)
332void apollo_graphics_15i::log_cr1(const char * text)
712333{
713   DLOG2(("%s: cr0=%02x cr1=%02x sr=%02x pixel_clock=%3d/%3d bl=%d vb=%d vs=%d hs=%d hc=%d vck=%d hck=%d pck=%d vd=%d",
334   MLOG2(("%s: cr0=%02x cr1=%02x sr=%02x pixel_clock=%3d/%3d bl=%d vb=%d vs=%d hs=%d hc=%d vck=%d hck=%d pck=%d vd=%d",
714335               text,
715336               m_cr0,
716337               m_cr1,
r29175r29176
728349               m_sr & SR_V_DATA ? 1 : 0));
729350}
730351
731void apollo_graphics::increment_h_clock()
352void apollo_graphics_15i::increment_h_clock()
732353{
733354   MLOG1(("increment_h_clock: sr=%02x m_h_clock=%d", m_sr, m_h_clock));
734355
r29175r29176
809430   m_h_clock++;
810431}
811432
812void apollo_graphics::increment_v_clock()
433void apollo_graphics_15i::increment_v_clock()
813434{
814435   MLOG1(("increment_v_clock: sr=%02x m_v_clock=%d", m_sr, m_v_clock));
815436
r29175r29176
896517   m_data_clock = 0;
897518}
898519
899void apollo_graphics::increment_p_clock()
520void apollo_graphics_15i::increment_p_clock()
900521{
901522   if (m_n_planes == 1)
902523   {
r29175r29176
954575   }
955576}
956577
957void apollo_graphics::set_cr1(device_t *device, UINT8 data)
578void apollo_graphics_15i::set_cr1(UINT8 data)
958579{
959580   UINT8 diffs = m_cr1 ^ data;
960581   m_cr1 = data;
r29175r29176
992613            m_sr = SR_H_CK | SR_V_BLANK | SR_SYNC | SR_DONE;
993614         }
994615      }
995      log_cr1("CR1_RESET", device);
616      log_cr1("CR1_RESET");
996617   }
997618   else
998619   {
999620      if ((diffs & CR1_RESET) && (m_cr1 & CR1_RESET) != 0)
1000621      {
1001         log_cr1("CR1_RESET", device);
622         log_cr1("CR1_RESET");
1002623      }
1003624
1004625      if (dh_clock)
1005626      {
1006627         increment_h_clock();
1007         log_cr1("CR1_DH_CK", device);
628         log_cr1("CR1_DH_CK");
1008629      }
1009630
1010631      if (dv_clock)
1011632      {
1012633         increment_v_clock();
1013         log_cr1("CR1_DV_CK", device);
634         log_cr1("CR1_DV_CK");
1014635      }
1015636
1016637      if (dp_clock)
1017638      {
1018639         increment_p_clock();
1019         log_cr1("CR1_DP_CK", device);
640         log_cr1("CR1_DP_CK");
1020641      }
1021642
1022643      if ((m_sr & SR_V_BLANK) == 0)
r29175r29176
1032653   }
1033654}
1034655
1035void apollo_graphics::set_cr3a(device_t *device, UINT8 data)
656void apollo_graphics_15i::set_cr3a(UINT8 data)
1036657{
1037658   m_cr3a = data;
1038659   if ((data & 0x80) == 0)
r29175r29176
1041662      UINT8 bit_mask = 1 << shift;
1042663      if (data & 0x01)
1043664      {
1044         set_cr1(device, m_cr1 | bit_mask);
665         set_cr1(m_cr1 | bit_mask);
1045666      }
1046667      else
1047668      {
1048         set_cr1(device, m_cr1 & ~bit_mask);
669         set_cr1(m_cr1 & ~bit_mask);
1049670      }
1050671   }
1051672}
1052673
1053void apollo_graphics::set_cr3b(device_t *device, UINT8 data)
674void apollo_graphics_15i::set_cr3b(UINT8 data)
1054675{
1055676   m_cr3b = data;
1056677   if ((data & 0x80) == 0)
r29175r29176
1059680      UINT8 bit_mask = 1 << shift;
1060681      if (data & 0x01)
1061682      {
1062         set_lut_cr(device, m_lut_control | bit_mask);
683         set_lut_cr(m_lut_control | bit_mask);
1063684      }
1064685      else
1065686      {
1066         set_lut_cr(device, m_lut_control & ~bit_mask);
687         set_lut_cr(m_lut_control & ~bit_mask);
1067688      }
1068689   }
1069690}
1070691
1071void apollo_graphics::set_lut_cr(device_t *device, UINT8 data)
692void apollo_graphics_15i::set_lut_cr(UINT8 data)
1072693{
1073694   UINT8 diffs = m_lut_control ^ data;
1074695   m_lut_control = data;
1075696
1076697   if ((diffs & LUT_CPAL_CS) && (data & LUT_CPAL_CS) != 0)
1077698   {
1078      DLOG1(("writing Color Graphics Controller: LUT_CPAL_CS Disabled"));
699      MLOG1(("writing Color Graphics Controller: LUT_CPAL_CS Disabled"));
1079700      while (!m_lut_fifo->is_empty())
1080701      {
1081702         m_bt458->write(m_lut_fifo->get(), LUT_C1_C0(m_lut_control));
r29175r29176
1084705
1085706   if ((diffs & LUT_FIFO_RST) && (data & LUT_FIFO_RST) == 0)
1086707   {
1087      DLOG1(("writing Color Graphics Controller: LUT_FIFO_RST Active"));
708      MLOG1(("writing Color Graphics Controller: LUT_FIFO_RST Active"));
1088709      m_lut_fifo->reset();
1089710      m_sr |= SR_LUT_OK;
1090711   }
1091712
1092713   if ((diffs & LUT_FIFO_CS) && (data & LUT_FIFO_CS) == 0)
1093714   {
1094      DLOG1(("writing Color Graphics Controller: LUT_FIFO_CS Enabled"));
715      MLOG1(("writing Color Graphics Controller: LUT_FIFO_CS Enabled"));
1095716   }
1096717
1097718   if ((diffs & LUT_ST_LUK) && (data & LUT_ST_LUK) == 0)
1098719   {
1099      DLOG1(("writing Color Graphics Controller: LUT_ST_LUK Active"));
720      MLOG1(("writing Color Graphics Controller: LUT_ST_LUK Active"));
1100721      m_sr &= ~SR_LUT_OK;
1101722   }
1102723}
1103724
1104READ8_DEVICE_HANDLER( apollo_graphics::apollo_mcr_r )
725READ8_MEMBER( apollo_graphics_15i::apollo_mcr_r )
1105726{
1106727   UINT8 data;
1107728   switch (offset & 0x407)
r29175r29176
1140761   {
1141762      if (offset == 0)
1142763         status0 = data;
1143      DLOG1(("reading Graphics Controller at offset %03x = %02x (%s)", offset, data, cr_text(offset, data, 1)));
764      MLOG1(("reading Graphics Controller at offset %03x = %02x (%s)", offset, data, cr_text(offset, data, 1)));
1144765   }
1145766
1146767   return data;
1147768}
1148769
1149WRITE8_DEVICE_HANDLER( apollo_graphics::apollo_mcr_w )
770WRITE8_MEMBER( apollo_graphics_15i::apollo_mcr_w )
1150771{
1151   DLOG1(("writing Graphics Controller at offset %03x = %02x (%s)", offset, data, cr_text(offset, data, 0)));
772   MLOG1(("writing Graphics Controller at offset %03x = %02x (%s)", offset, data, cr_text(offset, data, 0)));
1152773   switch (offset & 0x407)
1153774   {
1154775   case 0:
r29175r29176
1176797      m_cr0 = data;
1177798      break;
1178799   case 0x402:
1179      set_cr1(device, data);
800      set_cr1(data);
1180801      break;
1181802   case 0x404:
1182803      m_cr2 = data;
r29175r29176
1187808      m_sr |= SR_R_M_W;
1188809      break;
1189810   case 0x406:
1190      set_cr3a(device, data);
811      set_cr3a(data);
1191812      break;
1192813   case 0x407: // A/D Channel Register
1193814      m_ad_pending = 1;
r29175r29176
1196817   }
1197818}
1198819
1199void apollo_graphics::set_status_rmw()
820void apollo_graphics_15i::set_status_rmw()
1200821{
1201822   UINT8 plane, d_plane_bit;
1202823   UINT32 rop_reg;
r29175r29176
1225846   }
1226847}
1227848
1228UINT16 apollo_graphics::rop(UINT16 dest_data, UINT16 src_data, UINT8 plane)
849UINT16 apollo_graphics_15i::rop(UINT16 dest_data, UINT16 src_data, UINT8 plane)
1229850{
1230851   UINT16 src_data1 = src_data;
1231852   if (m_cr1 & CR1_ROP_EN)
r29175r29176
1285906   return src_data;
1286907}
1287908
1288void apollo_graphics::set_source_data(UINT32 offset)
909void apollo_graphics_15i::set_source_data(UINT32 offset)
1289910{
1290911   if (m_n_planes == 1 || (m_cr1 & CR1_AD_BIT))
1291912   {
r29175r29176
1305926   }
1306927}
1307928
1308UINT32 apollo_graphics::get_source_data(UINT8 plane)
929UINT32 apollo_graphics_15i::get_source_data(UINT8 plane)
1309930{
1310931   UINT32 src_data;
1311932
r29175r29176
1344965   return src_data;
1345966}
1346967
1347void apollo_graphics::blt(UINT32 dest_addr, UINT16 mem_mask)
968void apollo_graphics_15i::blt(UINT32 dest_addr, UINT16 mem_mask)
1348969{
1349970   UINT16 src_data, dest_data;
1350971   UINT8 d_plane_bit;
r29175r29176
1372993 Color graphics memory space at A0000 - BFFFF
1373994 ***************************************************************************/
1374995
1375READ16_DEVICE_HANDLER( apollo_graphics::apollo_mem_r )
996READ16_MEMBER( apollo_graphics_15i::apollo_mem_r )
1376997{
1377998   UINT16 data;
1378999   UINT32 src_addr;
r29175r29176
13801001   if (offset >= m_image_memory_size)
13811002   {
13821003      // 128 kB display buffer of 15" screen seems to be shadowed from $fa0000 to $fc0000
1383      DLOG1(("reading Graphics Memory at invalid offset %05x", offset));
1004      MLOG1(("reading Graphics Memory at invalid offset %05x", offset));
13841005      offset %= m_image_memory_size;
13851006   }
13861007
r29175r29176
14021023   // omit excessive logging
14031024   if ((offset & (m_image_plane_size - 1)) < 8)
14041025   {
1405      DLOG1(("reading Graphics Memory with mode %d: src_addr %05x = %04x & %04x", CR0_MODE(m_cr0), src_addr, data, mem_mask));
1026      MLOG1(("reading Graphics Memory with mode %d: src_addr %05x = %04x & %04x", CR0_MODE(m_cr0), src_addr, data, mem_mask));
14061027   }
14071028   else if ((offset & (m_image_plane_size - 1)) == 8)
14081029   {
1409      DLOG1(("..."));
1030      MLOG1(("..."));
14101031   }
14111032   return data;
14121033}
14131034
1414WRITE16_DEVICE_HANDLER( apollo_graphics::apollo_mem_w )
1035WRITE16_MEMBER( apollo_graphics_15i::apollo_mem_w )
14151036{
14161037   UINT32 dest_addr;
14171038   UINT32 src_addr;
r29175r29176
14191040   if (offset >= m_image_memory_size)
14201041   {
14211042      // 128 kB display buffer of 15" screen seems to be shadowed from $fa0000 to $fc0000
1422      DLOG1(("writing Graphics Memory at invalid offset %05x = %04x & %04x ", offset, data, mem_mask));
1043      MLOG1(("writing Graphics Memory at invalid offset %05x = %04x & %04x ", offset, data, mem_mask));
14231044      offset %= m_image_memory_size;
14241045   }
14251046
14261047   // omit excessive logging
14271048   if (offset < 24)
14281049   {
1429      DLOG1(("writing Graphics Memory with mode %d: offset=%04x data=%04x mask=%04x", CR0_MODE(m_cr0), offset, data, mem_mask));
1050      MLOG1(("writing Graphics Memory with mode %d: offset=%04x data=%04x mask=%04x", CR0_MODE(m_cr0), offset, data, mem_mask));
14301051   }
14311052   else if (offset == 24)
14321053   {
1433      DLOG1(("..."));
1054      MLOG1(("..."));
14341055   }
14351056
14361057   switch (CR0_MODE(m_cr0))
r29175r29176
15181139      break;
15191140
15201141   default:
1521      DLOG(("writing Graphics Memory - unexpected cr0 mode %d", CR0_MODE(m_cr0)))
1142      MLOG(("writing Graphics Memory - unexpected cr0 mode %d", CR0_MODE(m_cr0)))
15221143      ;
15231144      break;
15241145   }
r29175r29176
15291150 Color Screen
15301151 ***************************************************************************/
15311152
1532READ8_DEVICE_HANDLER( apollo_graphics::apollo_ccr_r )
1153READ8_MEMBER( apollo_graphics_15i::apollo_ccr_r )
15331154{
15341155   UINT8 data;
15351156
r29175r29176
15441165         data = m_ad_result;
15451166         break;
15461167      default:
1547         return apollo_mcr_r(device, space, offset, mem_mask);
1168         return apollo_mcr_r(space, offset, mem_mask);
15481169      }
15491170   }
15501171   else if (m_n_planes == 8)
r29175r29176
15691190         }
15701191         else if ((m_lut_control & LUT_R_W) == 0)
15711192         {
1572            DLOG1(("apollo_graphics::apollo_ccr_r: reading LUT data register with unexpected RW = 0 in LUT Control register"));
1193            MLOG1(("apollo_graphics_15i::apollo_ccr_r: reading LUT data register with unexpected RW = 0 in LUT Control register"));
15731194            data = m_lut_data;
15741195         }
15751196         else if ((m_lut_control & LUT_AD_CS) == 0)
r29175r29176
15821203         }
15831204         else
15841205         {
1585            DLOG1(("apollo_graphics::apollo_ccr_r: reading LUT data register with unexpected CS in LUT Control register"));
1206            MLOG1(("apollo_graphics_15i::apollo_ccr_r: reading LUT data register with unexpected CS in LUT Control register"));
15861207            data = m_lut_data;
15871208         }
15881209         break;
r29175r29176
16031224         data = m_cr3b;
16041225         break;
16051226      default:
1606         return apollo_mcr_r(device, space, offset, mem_mask);
1227         return apollo_mcr_r(space, offset, mem_mask);
16071228      }
16081229   }
16091230   else
r29175r29176
16171238   {
16181239      if (offset == 0)
16191240         status1 = data;
1620      DLOG1(("reading Color Graphics Controller at offset %03x = %02x (%s)", offset, data, cr_text(offset, data, 1)));
1241      MLOG1(("reading Color Graphics Controller at offset %03x = %02x (%s)", offset, data, cr_text(offset, data, 1)));
16211242   }
16221243
16231244   return data;
16241245}
16251246
1626UINT8 apollo_graphics::get_pixel(UINT32 offset, UINT16 mask)
1247UINT8 apollo_graphics_15i::get_pixel(UINT32 offset, UINT16 mask)
16271248{
16281249   UINT8 data = 0;
16291250   UINT16 *source_ptr = m_image_memory + offset;
r29175r29176
16661287
16671288// read the 4-plane ADC value for data
16681289
1669UINT8 apollo_graphics::c4p_read_adc(UINT8 data)
1290UINT8 apollo_graphics_15i::c4p_read_adc(UINT8 data)
16701291{
16711292   UINT8 value = 0;
16721293
r29175r29176
17201341
17211342// read the 8-plane ADC value for data
17221343
1723UINT8 apollo_graphics::c8p_read_adc(UINT8 data)
1344UINT8 apollo_graphics_15i::c8p_read_adc(UINT8 data)
17241345{
17251346   UINT8 value = 0;
17261347
r29175r29176
17711392   return value;
17721393}
17731394
1774WRITE8_DEVICE_HANDLER( apollo_graphics::apollo_ccr_w )
1395WRITE8_MEMBER( apollo_graphics_15i::apollo_ccr_w )
17751396{
17761397   static const UINT8 rgb_value[16] =
17771398   { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb,
r29175r29176
18121433         m_sr |= SR_DONE;
18131434         break;
18141435      default:
1815         apollo_mcr_w(device, space, offset, data, mem_mask);
1436         apollo_mcr_w(space, offset, data, mem_mask);
18161437         return;
18171438      }
18181439   }
r29175r29176
18441465         m_lut_data = data;
18451466         if ((m_lut_control & LUT_R_W) == 1)
18461467         {
1847            DLOG1(("apollo_graphics::apollo_ccr_w: writing LUT data register with RW = 1 in LUT Control register"));
1468            MLOG1(("apollo_graphics_15i::apollo_ccr_w: writing LUT data register with RW = 1 in LUT Control register"));
18481469         }
18491470         else if ((m_lut_control & LUT_AD_CS) == 0)
18501471         {
r29175r29176
18621483         }
18631484         else
18641485         {
1865            DLOG1(("apollo_graphics::apollo_ccr_w: writing LUT data register with unexpected CS in LUT Control register"));
1486            MLOG1(("apollo_graphics_15i::apollo_ccr_w: writing LUT data register with unexpected CS in LUT Control register"));
18661487         }
18671488         break;
18681489      case 0x403:
18691490         // LUT control register
1870         set_lut_cr(device, data);
1491         set_lut_cr(data);
18711492         break;
18721493      case 0x404:
18731494         // cr2a
r29175r29176
18831504         break;
18841505      case 0x407:
18851506         // cr3b
1886         set_cr3b(device, data);
1507         set_cr3b(data);
18871508         break;
18881509      default:
1889         apollo_mcr_w(device, space, offset, data, mem_mask);
1510         apollo_mcr_w(space, offset, data, mem_mask);
18901511         return;
18911512      }
18921513   }
18931514
1894   DLOG1(("writing Color Graphics Controller at offset %03x = %02x (%s)", offset, data, cr_text(offset, data, 0)));
1515   MLOG1(("writing Color Graphics Controller at offset %03x = %02x (%s)", offset, data, cr_text(offset, data, 0)));
18951516}
18961517
1897READ16_DEVICE_HANDLER( apollo_cgm_r )
1518READ16_MEMBER( apollo_graphics_15i::apollo_cgm_r )
18981519{
1899   apollo_graphics *apollo_graphics = get_safe_token(device);
1900   if (!apollo_graphics->is_mono())
1520   if (!is_mono())
19011521   {
1902      return apollo_graphics->apollo_mem_r(device, space, offset, mem_mask);
1522      return apollo_mem_r(space, offset, mem_mask);
19031523   }
19041524   else
19051525   {
r29175r29176
19071527   }
19081528}
19091529
1910WRITE16_DEVICE_HANDLER( apollo_cgm_w )
1530WRITE16_MEMBER( apollo_graphics_15i::apollo_cgm_w )
19111531{
1912   apollo_graphics *apollo_graphics = get_safe_token(device);
1913   if (!apollo_graphics->is_mono())
1532   if (!is_mono())
19141533   {
1915      apollo_graphics->apollo_mem_w(device, space, offset, data, mem_mask);
1534      apollo_mem_w(space, offset, data, mem_mask);
19161535   }
19171536}
19181537
r29175r29176
19201539 VIDEO HARDWARE
19211540 ***************************************************************************/
19221541
1923UINT32 apollo_graphics::screen_update(bitmap_rgb32 &bitmap,
1924      const rectangle &cliprect)
1542UINT32 apollo_graphics_15i::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
19251543{
19261544   int has_changed = 0;
19271545
r29175r29176
19361554   return has_changed ? 0 : UPDATE_HAS_NOT_CHANGED;
19371555}
19381556
1939void apollo_graphics::screen_update1(bitmap_rgb32 &bitmap,
1940      const rectangle &cliprect)
1557void apollo_graphics_15i::screen_update1(bitmap_rgb32 &bitmap, const rectangle &cliprect)
19411558{
19421559   UINT16 *source_ptr = m_image_memory;
19431560   int x, y;
r29175r29176
20411658 called on each state change of the VBLANK signal
20421659 -------------------------------------------------*/
20431660
2044void apollo_graphics::vblank_state_changed(device_t *device,
2045      screen_device &screen, bool vblank_state)
1661void apollo_graphics_15i::vblank_state_changed(screen_device &screen, bool vblank_state)
20461662{
20471663   if ((m_cr1 & CR1_RESET) && (m_cr1 & CR1_SYNC_EN))
20481664   {
r29175r29176
20771693   }
20781694}
20791695
2080void vblank_state_changed(device_t *device, screen_device &screen,
2081      bool vblank_state)
1696void apollo_graphics_15i::register_vblank_callback()
20821697{
2083   apollo_graphics *apollo_graphics = get_safe_token(device);
2084   apollo_graphics->vblank_state_changed(device, screen, vblank_state);
2085}
1698   MLOG1(("register_vblank_callback"));
20861699
2087static void register_vblank_callback(device_t *device)
2088{
2089   DLOG1(("register_vblank_callback"));
2090
20911700   /* register for VBLANK callbacks */
2092   screen_device *screen = (screen_device *) device->machine().device(
2093         VIDEO_SCREEN_TAG);
2094   screen->register_vblank_callback(vblank_state_delegate(
2095         FUNC(vblank_state_changed),device) );
1701   screen_device *screen = (screen_device *)machine().device(VIDEO_SCREEN_TAG);
1702   screen->register_vblank_callback(vblank_state_delegate(FUNC(apollo_graphics_15i::vblank_state_changed),this));
20961703}
20971704
2098UINT32 apollo_graphics_15i::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
2099{
2100   apollo_graphics *apollo_graphics = get_safe_token(this);
2101   return apollo_graphics->screen_update(bitmap, cliprect);
2102}
21031705
21041706/***************************************************************************
21051707 MACHINE DRIVERS
r29175r29176
21181720
21191721const device_type APOLLO_GRAPHICS = &device_creator<apollo_graphics_15i> ;
21201722
2121apollo_graphics_15i::apollo_graphics_15i(const machine_config &mconfig,
2122      const char *tag, device_t *owner, UINT32 clock) :
2123   device_t(mconfig, APOLLO_GRAPHICS, "Apollo Screen", tag, owner, clock,
2124         "apollo_graphics_15i", __FILE__)
1723apollo_graphics_15i::apollo_graphics_15i(const machine_config &mconfig,const char *tag, device_t *owner, UINT32 clock) :
1724   device_t(mconfig, APOLLO_GRAPHICS, "Apollo Screen", tag, owner, clock,"apollo_graphics_15i", __FILE__),
1725   m_lut_fifo(NULL),
1726   m_bt458(NULL)
21251727{
2126   m_token = new apollo_graphics;
1728   
21271729}
21281730
2129apollo_graphics_15i::apollo_graphics_15i(const machine_config &mconfig,
2130      const char *tag, device_t *owner, UINT32 clock, device_type type,
2131      const char *name, const char *shortname, const char *source) :
2132   device_t(mconfig, type, name, tag, owner, clock, shortname, source)
1731apollo_graphics_15i::apollo_graphics_15i(const machine_config &mconfig,const char *tag, device_t *owner, UINT32 clock, device_type type,const char *name, const char *shortname, const char *source) :
1732   device_t(mconfig, type, name, tag, owner, clock, shortname, source),
1733   m_lut_fifo(NULL),
1734   m_bt458(NULL)
21331735{
2134   m_token = new apollo_graphics;
21351736}
21361737
21371738apollo_graphics_15i::~apollo_graphics_15i()
21381739{
2139   global_free(m_token);
1740   if (m_lut_fifo) global_free(m_lut_fifo);
1741   if (m_bt458) global_free(m_bt458);
21401742}
21411743
21421744//-------------------------------------------------
r29175r29176
21571759{
21581760   MLOG1(("apollo_graphics_15i::device_start"))
21591761
2160   apollo_graphics *apollo_graphics = get_safe_token(this);
2161   apollo_graphics->device_start(machine());
1762   m_n_planes = 0;
1763   m_width = 0;
1764   m_height = 0;
1765   m_buffer_width = 0;
1766   m_buffer_height = 0;
1767
1768   m_sr = 0;
1769   m_device_id = 0;
1770   m_write_enable_register = 0;
1771   m_rop_register = 0;
1772   m_diag_mem_request = 0;
1773   m_cr0 = 0;
1774   m_cr1 = 0;
1775   m_cr2 = 0;
1776   m_cr2b = 0;
1777   m_cr2_s_data = 0;
1778   m_cr2_s_plane = 0x00;
1779   m_cr2_d_plane = 0x0e;
1780   m_cr3a = 0;
1781   m_cr3b = 0;
1782   m_ad_result = 0;
1783   m_ad_pending = 0;
1784
1785   m_lut_control = 0;
1786   m_lut_data = 0;
1787
1788   m_update_flag = 0;
1789   m_update_pending = 0;
1790
1791   m_blt_cycle_count = 0;
1792   m_image_offset = 0;
1793   memset(m_guard_latch, 0, sizeof(m_guard_latch));
1794
1795   m_h_clock = 0;
1796   m_v_clock = 0;
1797   m_p_clock = 0;
1798   m_data_clock = 0;
1799
1800   m_image_memory = 0;
1801   m_image_plane_size = 0;
1802   m_image_memory_size = 0;
1803
1804   memset(m_color_lookup_table, 0, sizeof(m_color_lookup_table));
1805
1806   m_lut_fifo = NULL;
1807   m_bt458 = NULL;
21621808}
21631809
21641810//-------------------------------------------------
r29175r29176
21691815{
21701816   MLOG1(("apollo_graphics_15i::device_reset"));
21711817
2172   apollo_graphics *apollo_graphics = get_safe_token(this);
2173   apollo_graphics->device_reset();
1818   if (m_n_planes == 0)
1819   {
1820      if (apollo_config(APOLLO_CONF_MONO_19I))
1821      {
1822         // monochrome 1280x1024
1823         m_n_planes = 1;
1824         m_device_id = SCREEN_DEVICE_ID_19I;
1825         m_width = 1280;
1826         m_height = 1024;
1827         m_buffer_width = 2048;
1828         m_buffer_height = 1024;
1829      }
1830      else if (apollo_config(APOLLO_CONF_MONO_15I))
1831      {
1832         // monochrome 1024x800
1833         m_n_planes = 1;
1834         m_device_id = SCREEN_DEVICE_ID_15I;
1835         m_width = 1024;
1836         m_height = 800;
1837         m_buffer_width = 1024;
1838         m_buffer_height = 1024;
1839      }
1840      else if (apollo_config(APOLLO_CONF_4_PLANES))
1841      {
1842         // 4-planes color 1024x800
1843         m_n_planes = 4;
1844         m_device_id = SCREEN_DEVICE_ID_C4P;
1845         m_width = 1024;
1846         m_height = 800;
1847         m_buffer_width = 1024;
1848         m_buffer_height = 1024;
1849      }
1850      else
1851      {
1852         // 8-planes color 1024x800
1853         m_n_planes = 8;
1854         m_device_id = SCREEN_DEVICE_ID_C8P;
1855         m_width = 1024;
1856         m_height = 800;
1857         m_buffer_width = 1024;
1858         m_buffer_height = 1024;
21741859
2175   /* FIXME: register for VBLANK callbacks */
2176   register_vblank_callback(this);
2177}
1860         if (m_lut_fifo) global_free(m_lut_fifo);
1861         if (m_bt458) global_free(m_bt458);
21781862
2179READ8_DEVICE_HANDLER( apollo_ccr_r )
2180{
2181   apollo_graphics *apollo_graphics = get_safe_token(device);
2182   return apollo_graphics->apollo_ccr_r(device, space, offset, mem_mask);
2183}
1863         m_lut_fifo = global_alloc(lut_fifo);
21841864
2185WRITE8_DEVICE_HANDLER( apollo_ccr_w )
2186{
2187   apollo_graphics *apollo_graphics = get_safe_token(device);
2188   apollo_graphics->apollo_ccr_w(device, space, offset, data, mem_mask);
1865         m_bt458 = global_alloc(bt458(machine()));
1866         m_bt458->start();
1867         m_bt458->reset();
1868      }
1869   }
1870
1871   if (m_image_memory == NULL)
1872   {
1873      /* allocate the memory image */
1874      m_image_plane_size = m_buffer_height * m_buffer_width / 16;
1875      m_image_memory_size = m_image_plane_size * m_n_planes;
1876      m_image_memory
1877            = auto_alloc_array(machine(), UINT16, m_image_memory_size);
1878      assert(m_image_memory != NULL);
1879
1880      MLOG1(("device reset apollo graphics: buffer=%p size=%0x", m_image_memory, m_image_memory_size));
1881   }
1882
1883   memset(m_color_lookup_table, 0, sizeof(m_color_lookup_table));
1884   memset(m_image_memory, 0, m_image_memory_size * 2);
1885
1886   //  register_vblank_callback(this);
1887   
1888   /* FIXME: register for VBLANK callbacks */
1889   register_vblank_callback();
21891890}
21901891
21911892//-------------------------------------------------
r29175r29176
22401941{
22411942   MLOG1(("apollo_graphics_19i::device_reset"));
22421943
2243   apollo_graphics *apollo_graphics = get_safe_token(this);
2244   apollo_graphics->device_reset_mono19i();
1944   if (m_n_planes == 0)
1945   {
1946      // monochrome 1280x1024
1947      m_n_planes = 1;
1948      m_device_id = SCREEN_DEVICE_ID_19I;
1949      m_width = 1280;
1950      m_height = 1024;
1951      m_buffer_width = 2048;
1952      m_buffer_height = 1024;
1953   }
22451954
1955   apollo_graphics_15i::device_reset();
1956
22461957   /* FIXME: register for VBLANK callbacks */
2247   register_vblank_callback(this);
1958   register_vblank_callback();
22481959}
22491960
2250READ8_DEVICE_HANDLER( apollo_mcr_r )
2251{
2252   apollo_graphics *apollo_graphics = get_safe_token(device);
2253   return apollo_graphics->apollo_mcr_r(device, space, offset, mem_mask);
2254}
22551961
2256WRITE8_DEVICE_HANDLER( apollo_mcr_w )
2257{
2258   apollo_graphics *apollo_graphics = get_safe_token(device);
2259   apollo_graphics->apollo_mcr_w(device, space, offset, data, mem_mask);
2260}
2261
2262READ16_DEVICE_HANDLER( apollo_mgm_r )
2263{
2264   apollo_graphics *apollo_graphics = get_safe_token(device);
2265   if (apollo_graphics->is_mono())
1962READ16_MEMBER( apollo_graphics_15i::apollo_mgm_r )
1963{   
1964   if (is_mono())
22661965   {
2267      return apollo_graphics->apollo_mem_r(device, space, offset, mem_mask);
1966      return apollo_mem_r(space, offset, mem_mask);
22681967   }
22691968   else
22701969   {
r29175r29176
22721971   }
22731972}
22741973
2275WRITE16_DEVICE_HANDLER( apollo_mgm_w )
1974WRITE16_MEMBER( apollo_graphics_15i::apollo_mgm_w )
22761975{
2277   apollo_graphics *apollo_graphics = get_safe_token(device);
2278   if (apollo_graphics->is_mono())
1976   if (is_mono())
22791977   {
2280      apollo_graphics->apollo_mem_w(device, space, offset, data, mem_mask);
1978      apollo_mem_w(space, offset, data, mem_mask);
22811979   }
22821980}

Previous 199869 Revisions Next


© 1997-2024 The MAME Team