summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Miodrag Milanovic <mmicko@gmail.com>2014-04-02 07:46:06 +0000
committer Miodrag Milanovic <mmicko@gmail.com>2014-04-02 07:46:06 +0000
commit5818511ba761a7980240405f397a40cc8dbf4624 (patch)
treef38fe4e45d9912e41f8b1be36cd4f585466d4593 /src
parentfac598ebd1e113817f8d36e2847fdbbfac73c6ef (diff)
modernized apollo a little bit more (nw)
Diffstat (limited to 'src')
-rw-r--r--src/mess/drivers/apollo.c24
-rw-r--r--src/mess/includes/apollo.h233
-rw-r--r--src/mess/video/apollo.c756
3 files changed, 456 insertions, 557 deletions
diff --git a/src/mess/drivers/apollo.c b/src/mess/drivers/apollo.c
index 83b3f1f6224..5f3b397ea85 100644
--- a/src/mess/drivers/apollo.c
+++ b/src/mess/drivers/apollo.c
@@ -688,11 +688,11 @@ static ADDRESS_MAP_START(dn3500_map, AS_PROGRAM, 32, apollo_state )
AM_RANGE(0x016400, 0x0164ff) AM_READWRITE16(selective_clear_locations_r, selective_clear_locations_w, 0xffffffff )
AM_RANGE(0x017000, 0x017fff) AM_READWRITE16(apollo_address_translation_map_r, apollo_address_translation_map_w, 0xffffffff )
- AM_RANGE(0x05d800, 0x05dc07) AM_DEVREADWRITE8_LEGACY(APOLLO_SCREEN_TAG, apollo_mcr_r, apollo_mcr_w, 0xffffffff)
- AM_RANGE(0xfa0000, 0xfdffff) AM_DEVREADWRITE16_LEGACY(APOLLO_SCREEN_TAG, apollo_mgm_r, apollo_mgm_w, 0xffffffff)
+ AM_RANGE(0x05d800, 0x05dc07) AM_DEVREADWRITE8(APOLLO_SCREEN_TAG, apollo_graphics_15i, apollo_mcr_r, apollo_mcr_w, 0xffffffff)
+ AM_RANGE(0xfa0000, 0xfdffff) AM_DEVREADWRITE16(APOLLO_SCREEN_TAG, apollo_graphics_15i, apollo_mgm_r, apollo_mgm_w, 0xffffffff)
- AM_RANGE(0x05e800, 0x05ec07) AM_DEVREADWRITE8_LEGACY(APOLLO_SCREEN_TAG, apollo_ccr_r, apollo_ccr_w, 0xffffffff)
- AM_RANGE(0x0a0000, 0x0bffff) AM_DEVREADWRITE16_LEGACY(APOLLO_SCREEN_TAG, apollo_cgm_r, apollo_cgm_w, 0xffffffff)
+ AM_RANGE(0x05e800, 0x05ec07) AM_DEVREADWRITE8(APOLLO_SCREEN_TAG, apollo_graphics_15i, apollo_ccr_r, apollo_ccr_w, 0xffffffff)
+ AM_RANGE(0x0a0000, 0x0bffff) AM_DEVREADWRITE16(APOLLO_SCREEN_TAG, apollo_graphics_15i, apollo_cgm_r, apollo_cgm_w, 0xffffffff)
AM_RANGE(ATBUS_IO_BASE, ATBUS_IO_END) AM_READWRITE16(apollo_atbus_io_r, apollo_atbus_io_w, 0xffffffff)
@@ -762,11 +762,11 @@ static ADDRESS_MAP_START(dn3000_map, AS_PROGRAM, 32, apollo_state )
AM_RANGE(0x009500, 0x0095ff) AM_DEVREADWRITE8(APOLLO_PIC2_TAG, pic8259_device, read, write, 0xffffffff)
AM_RANGE(0x009600, 0x0096ff) AM_READWRITE16(apollo_node_id_r, apollo_node_id_w, 0xffffffff)
- AM_RANGE(0x05d800, 0x05dc07) AM_DEVREADWRITE8_LEGACY(APOLLO_SCREEN_TAG, apollo_mcr_r, apollo_mcr_w, 0xffffffff)
- AM_RANGE(0xfa0000, 0xfdffff) AM_DEVREADWRITE16_LEGACY(APOLLO_SCREEN_TAG, apollo_mgm_r, apollo_mgm_w, 0xffffffff)
+ AM_RANGE(0x05d800, 0x05dc07) AM_DEVREADWRITE8(APOLLO_SCREEN_TAG, apollo_graphics_15i, apollo_mcr_r, apollo_mcr_w, 0xffffffff)
+ AM_RANGE(0xfa0000, 0xfdffff) AM_DEVREADWRITE16(APOLLO_SCREEN_TAG, apollo_graphics_15i, apollo_mgm_r, apollo_mgm_w, 0xffffffff)
- AM_RANGE(0x05e800, 0x05ec07) AM_DEVREADWRITE8_LEGACY(APOLLO_SCREEN_TAG, apollo_ccr_r, apollo_ccr_w, 0xffffffff)
- AM_RANGE(0x0a0000, 0x0bffff) AM_DEVREADWRITE16_LEGACY(APOLLO_SCREEN_TAG, apollo_cgm_r, apollo_cgm_w, 0xffffffff)
+ AM_RANGE(0x05e800, 0x05ec07) AM_DEVREADWRITE8(APOLLO_SCREEN_TAG, apollo_graphics_15i, apollo_ccr_r, apollo_ccr_w, 0xffffffff)
+ AM_RANGE(0x0a0000, 0x0bffff) AM_DEVREADWRITE16(APOLLO_SCREEN_TAG, apollo_graphics_15i, apollo_cgm_r, apollo_cgm_w, 0xffffffff)
AM_RANGE(ATBUS_IO_BASE, ATBUS_IO_END) AM_READWRITE16(apollo_atbus_io_r, apollo_atbus_io_w, 0xffffffff)
@@ -836,11 +836,11 @@ static ADDRESS_MAP_START(dn5500_map, AS_PROGRAM, 32, apollo_state )
AM_RANGE(0x016400, 0x0164ff) AM_READWRITE16(selective_clear_locations_r, selective_clear_locations_w, 0xffffffff )
AM_RANGE(0x017000, 0x017fff) AM_READWRITE16(apollo_address_translation_map_r, apollo_address_translation_map_w, 0xffffffff )
- AM_RANGE(0x05d800, 0x05dc07) AM_DEVREADWRITE8_LEGACY(APOLLO_SCREEN_TAG, apollo_mcr_r, apollo_mcr_w, 0xffffffff)
- AM_RANGE(0xfa0000, 0xfdffff) AM_DEVREADWRITE16_LEGACY(APOLLO_SCREEN_TAG, apollo_mgm_r, apollo_mgm_w, 0xffffffff)
+ AM_RANGE(0x05d800, 0x05dc07) AM_DEVREADWRITE8(APOLLO_SCREEN_TAG, apollo_graphics_15i, apollo_mcr_r, apollo_mcr_w, 0xffffffff)
+ AM_RANGE(0xfa0000, 0xfdffff) AM_DEVREADWRITE16(APOLLO_SCREEN_TAG, apollo_graphics_15i, apollo_mgm_r, apollo_mgm_w, 0xffffffff)
- AM_RANGE(0x05e800, 0x05ec07) AM_DEVREADWRITE8_LEGACY(APOLLO_SCREEN_TAG, apollo_ccr_r, apollo_ccr_w, 0xffffffff)
- AM_RANGE(0x0a0000, 0x0bffff) AM_DEVREADWRITE16_LEGACY(APOLLO_SCREEN_TAG, apollo_cgm_r, apollo_cgm_w, 0xffffffff)
+ AM_RANGE(0x05e800, 0x05ec07) AM_DEVREADWRITE8(APOLLO_SCREEN_TAG, apollo_graphics_15i, apollo_ccr_r, apollo_ccr_w, 0xffffffff)
+ AM_RANGE(0x0a0000, 0x0bffff) AM_DEVREADWRITE16(APOLLO_SCREEN_TAG, apollo_graphics_15i, apollo_cgm_r, apollo_cgm_w, 0xffffffff)
AM_RANGE(ATBUS_IO_BASE, ATBUS_IO_END) AM_READWRITE16(apollo_atbus_io_r, apollo_atbus_io_w, 0xffffffff)
diff --git a/src/mess/includes/apollo.h b/src/mess/includes/apollo.h
index 75b6cc7fc47..479c8a483ba 100644
--- a/src/mess/includes/apollo.h
+++ b/src/mess/includes/apollo.h
@@ -301,20 +301,232 @@ public:
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);
~apollo_graphics_15i();
- // access to legacy token
- class apollo_graphics *token() const { assert(m_token != NULL); return m_token; }
-
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+
+ // monochrome control
+ DECLARE_READ8_MEMBER( apollo_mcr_r );
+ DECLARE_WRITE8_MEMBER( apollo_mcr_w );
+
+ // monochrome and color memory
+ DECLARE_READ16_MEMBER( apollo_mem_r );
+ DECLARE_WRITE16_MEMBER( apollo_mem_w );
+
+ // color control
+ DECLARE_READ8_MEMBER( apollo_ccr_r );
+ DECLARE_WRITE8_MEMBER( apollo_ccr_w );
+
+ DECLARE_READ16_MEMBER( apollo_mgm_r );
+ DECLARE_WRITE16_MEMBER( apollo_mgm_w );
+
+ DECLARE_READ16_MEMBER( apollo_cgm_r );
+ DECLARE_WRITE16_MEMBER( apollo_cgm_w );
+
+ void vblank_state_changed(screen_device &screen, bool vblank_state);
+
+ int is_mono() { return m_n_planes == 1; }
+
protected:
// device-level overrides
virtual void device_config_complete();
virtual void device_start();
virtual void device_reset();
+protected:
+ class lut_fifo;
+ class bt458;
+
+ const char *cr_text(offs_t offset, UINT8 data, UINT8 rw);
+
+ void increment_h_clock();
+ void increment_v_clock();
+ void increment_p_clock();
+
+ void log_cr1(const char * text);
+ void set_cr1(UINT8 data);
+ void set_cr3a(UINT8 data);
+ void set_cr3b(UINT8 data);
+ void set_lut_cr(UINT8 data);
+
+ void register_vblank_callback();
+
+ UINT32 set_msb0(UINT32 value, UINT8 data)
+ {
+ return (value & 0xffffff00) | data;
+ }
+ UINT32 set_lsb0(UINT32 value, UINT8 data)
+ {
+ return (value & 0xffff00ff) | (data << 8);
+ }
+ UINT32 set_msb1(UINT32 value, UINT8 data)
+ {
+ return (value & 0xff00ffff) | (data << 16);
+ }
+ UINT32 set_lsb1(UINT32 value, UINT8 data)
+ {
+ return (value & 0x00ffffff) | (data << 24);
+ }
+ UINT8 get_msb1(UINT32 value)
+ {
+ return (value >> 16) & 0xff;
+ }
+ UINT8 get_lsb1(UINT32 value)
+ {
+ return (value >> 24) & 0xff;
+ }
+
+ void set_status_rmw();
+ UINT16 rop(UINT16 dest_data, UINT16 src_data, UINT8 plane);
+ void set_source_data(UINT32 offset);
+ UINT32 get_source_data(UINT8 plane);
+ void blt(UINT32 dest_addr, UINT16 mem_mask);
+
+ UINT8 get_pixel(UINT32 offset, UINT16 mask);
+ UINT8 c4p_read_adc(UINT8 data);
+ UINT8 c8p_read_adc(UINT8 data);
+
+ void screen_update1(bitmap_rgb32 &bitmap, const rectangle &cliprect);
+protected:
+ UINT16 m_n_planes;
+ UINT16 m_width;
+ UINT16 m_height;
+ UINT16 m_buffer_width;
+ UINT16 m_buffer_height;
+
+ UINT8 m_sr;
+ UINT8 m_device_id;
+ UINT16 m_write_enable_register;
+ UINT32 m_rop_register;
+ UINT16 m_diag_mem_request;
+ UINT8 m_cr0;
+ UINT8 m_cr1;
+ UINT8 m_cr2;
+ UINT8 m_cr2b;
+ UINT8 m_cr2_s_data;
+ UINT8 m_cr2_s_plane;
+ UINT8 m_cr2_d_plane;
+ UINT8 m_cr3a;
+ UINT8 m_cr3b;
+ UINT8 m_ad_result;
+ UINT8 m_ad_pending;
+
+ UINT8 m_lut_control;
+ UINT8 m_lut_data;
+
+ UINT8 m_update_flag;
+ UINT8 m_update_pending;
+
+ UINT8 m_blt_cycle_count;
+ UINT32 m_image_offset;
+ UINT32 m_guard_latch[8];
+
+ int m_h_clock;
+ int m_v_clock;
+ int m_p_clock;
+ int m_data_clock;
+
+ UINT16 *m_image_memory;
+ int m_image_plane_size;
+ int m_image_memory_size;
+
+ UINT32 m_color_lookup_table[16];
+
+ lut_fifo *m_lut_fifo;
+ bt458 *m_bt458;
+};
+
+
+#define LUT_FIFO_SIZE 1024
+
+
+//**************************************************************************
+// class LUT Fifo
+//**************************************************************************
+
+class apollo_graphics_15i::lut_fifo
+{
+public:
+ lut_fifo()
+ {
+ reset();
+ }
+
+ void reset()
+ {
+ m_size = LUT_FIFO_SIZE;
+ m_get_index = 0;
+ m_put_index = 0;
+ }
+
+ void put(const UINT8 data)
+ {
+ if (!is_full())
+ {
+ m_data[m_put_index] = data;
+ m_put_index = (m_put_index + 1) % m_size;
+ }
+ }
+
+ UINT8 get()
+ {
+ UINT8 data = is_empty() ? 0xff : m_data[m_get_index];
+ m_get_index = (m_get_index + 1) % m_size;
+ return data;
+ }
+
+ int is_empty()
+ {
+ return m_get_index == m_put_index;
+ }
+
+ int is_full()
+ {
+ return ((m_put_index + 1) % m_size) == m_get_index;
+ }
+
private:
- // internal state
- class apollo_graphics *m_token;
+ UINT16 m_size;
+ UINT16 m_get_index;
+ UINT16 m_put_index;
+ UINT8 m_data[LUT_FIFO_SIZE];
+};
+
+//**************************************************************************
+// class Brooktree Bt458
+//**************************************************************************
+
+class apollo_graphics_15i::bt458
+{
+public:
+ bt458(running_machine &running_machine);
+ void start();
+ void reset();
+ UINT8 read(UINT8 c10);
+ void write(UINT8 data, UINT8 c10);
+ UINT32 get_rgb(UINT8 index);
+
+private:
+ running_machine &machine() const
+ {
+ assert(m_machine != NULL);
+ return *m_machine;
+ }
+
+ UINT8 m_color_counter;
+ UINT8 m_red;
+ UINT8 m_green;
+
+ UINT8 m_address_register;
+ UINT32 m_color_palette_RAM[256];
+ UINT32 m_overlay_color[4];
+ UINT8 m_read_mask_register;
+ UINT8 m_blink_mask_register;
+ UINT8 m_command_register;
+ UINT8 m_control_test_register;
+
+ running_machine *m_machine;
};
+
+
extern const device_type APOLLO_GRAPHICS;
#define MCFG_APOLLO_GRAPHICS_ADD( _tag) \
@@ -344,16 +556,5 @@ extern const device_type APOLLO_MONO19I;
MACHINE_CONFIG_EXTERN( apollo_mono19i );
-DECLARE_READ8_DEVICE_HANDLER( apollo_mcr_r ) ;
-DECLARE_WRITE8_DEVICE_HANDLER(apollo_mcr_w );
-
-DECLARE_READ16_DEVICE_HANDLER( apollo_mgm_r );
-DECLARE_WRITE16_DEVICE_HANDLER( apollo_mgm_w );
-
-DECLARE_READ8_DEVICE_HANDLER( apollo_ccr_r ) ;
-DECLARE_WRITE8_DEVICE_HANDLER(apollo_ccr_w );
-
-DECLARE_READ16_DEVICE_HANDLER( apollo_cgm_r );
-DECLARE_WRITE16_DEVICE_HANDLER( apollo_cgm_w );
#endif /* APOLLO_H_ */
diff --git a/src/mess/video/apollo.c b/src/mess/video/apollo.c
index 3606fac362d..41608fe2c80 100644
--- a/src/mess/video/apollo.c
+++ b/src/mess/video/apollo.c
@@ -96,250 +96,20 @@
#define LUT_C0 0x01
#define LUT_C1_C0(a) ((a)& (LUT_C1|LUT_C0))
-#define LUT_FIFO_SIZE 1024
-//**************************************************************************
-// class apollo_graphics
-//**************************************************************************
-
-class apollo_graphics /*: public device_t*/
-{
-public:
- apollo_graphics()
- {
- }
-
- void device_start(running_machine &m_machine);
- void device_reset();
- void device_reset_mono19i();
-
- // monochrome control
- READ8_DEVICE_HANDLER( apollo_mcr_r );
- WRITE8_DEVICE_HANDLER( apollo_mcr_w );
-
- // monochrome and color memory
- READ16_DEVICE_HANDLER( apollo_mem_r );
- WRITE16_DEVICE_HANDLER( apollo_mem_w );
-
- // color control
- READ8_DEVICE_HANDLER( apollo_ccr_r );
- WRITE8_DEVICE_HANDLER( apollo_ccr_w );
-
- UINT32 screen_update(bitmap_rgb32 &bitmap, const rectangle &cliprect);
- void vblank_state_changed(device_t *device, screen_device &screen, bool vblank_state);
-
- int is_mono() { return m_n_planes == 1; }
-
-private:
- class lut_fifo;
- class bt458;
-
- running_machine &machine() const
- {
- assert(m_machine != NULL);
- return *m_machine;
- }
-
- const char *cr_text(offs_t offset, UINT8 data, UINT8 rw);
-
- void increment_h_clock();
- void increment_v_clock();
- void increment_p_clock();
-
- void log_cr1(const char * text, device_t *device);
- void set_cr1(device_t *device, UINT8 data);
- void set_cr3a(device_t *device, UINT8 data);
- void set_cr3b(device_t *device, UINT8 data);
- void set_lut_cr(device_t *device, UINT8 data);
-
- UINT32 set_msb0(UINT32 value, UINT8 data)
- {
- return (value & 0xffffff00) | data;
- }
- UINT32 set_lsb0(UINT32 value, UINT8 data)
- {
- return (value & 0xffff00ff) | (data << 8);
- }
- UINT32 set_msb1(UINT32 value, UINT8 data)
- {
- return (value & 0xff00ffff) | (data << 16);
- }
- UINT32 set_lsb1(UINT32 value, UINT8 data)
- {
- return (value & 0x00ffffff) | (data << 24);
- }
- UINT8 get_msb1(UINT32 value)
- {
- return (value >> 16) & 0xff;
- }
- UINT8 get_lsb1(UINT32 value)
- {
- return (value >> 24) & 0xff;
- }
-
- void set_status_rmw();
- UINT16 rop(UINT16 dest_data, UINT16 src_data, UINT8 plane);
- void set_source_data(UINT32 offset);
- UINT32 get_source_data(UINT8 plane);
- void blt(UINT32 dest_addr, UINT16 mem_mask);
-
- UINT8 get_pixel(UINT32 offset, UINT16 mask);
- UINT8 c4p_read_adc(UINT8 data);
- UINT8 c8p_read_adc(UINT8 data);
-
- void screen_update1(bitmap_rgb32 &bitmap, const rectangle &cliprect);
-
- UINT16 m_n_planes;
- UINT16 m_width;
- UINT16 m_height;
- UINT16 m_buffer_width;
- UINT16 m_buffer_height;
-
- UINT8 m_sr;
- UINT8 m_device_id;
- UINT16 m_write_enable_register;
- UINT32 m_rop_register;
- UINT16 m_diag_mem_request;
- UINT8 m_cr0;
- UINT8 m_cr1;
- UINT8 m_cr2;
- UINT8 m_cr2b;
- UINT8 m_cr2_s_data;
- UINT8 m_cr2_s_plane;
- UINT8 m_cr2_d_plane;
- UINT8 m_cr3a;
- UINT8 m_cr3b;
- UINT8 m_ad_result;
- UINT8 m_ad_pending;
-
- UINT8 m_lut_control;
- UINT8 m_lut_data;
-
- UINT8 m_update_flag;
- UINT8 m_update_pending;
-
- UINT8 m_blt_cycle_count;
- UINT32 m_image_offset;
- UINT32 m_guard_latch[8];
-
- int m_h_clock;
- int m_v_clock;
- int m_p_clock;
- int m_data_clock;
-
- UINT16 *m_image_memory;
- int m_image_plane_size;
- int m_image_memory_size;
-
- UINT32 m_color_lookup_table[16];
-
- lut_fifo *m_lut_fifo;
- bt458 *m_bt458;
-
- running_machine *m_machine;
-};
-
- //**************************************************************************
- // class LUT Fifo
- //**************************************************************************
-
-class apollo_graphics::lut_fifo
-{
-public:
- lut_fifo()
- {
- reset();
- }
-
- void reset()
- {
- m_size = LUT_FIFO_SIZE;
- m_get_index = 0;
- m_put_index = 0;
- }
-
- void put(const UINT8 data)
- {
- if (!is_full())
- {
- m_data[m_put_index] = data;
- m_put_index = (m_put_index + 1) % m_size;
- }
- }
-
- UINT8 get()
- {
- UINT8 data = is_empty() ? 0xff : m_data[m_get_index];
- m_get_index = (m_get_index + 1) % m_size;
- return data;
- }
-
- int is_empty()
- {
- return m_get_index == m_put_index;
- }
-
- int is_full()
- {
- return ((m_put_index + 1) % m_size) == m_get_index;
- }
-
-private:
- UINT16 m_size;
- UINT16 m_get_index;
- UINT16 m_put_index;
- UINT8 m_data[LUT_FIFO_SIZE];
-};
-
-//**************************************************************************
-// class Brooktree Bt458
-//**************************************************************************
-
-class apollo_graphics::bt458
-{
-public:
- bt458(running_machine &running_machine);
- void start();
- void reset();
- UINT8 read(UINT8 c10);
- void write(UINT8 data, UINT8 c10);
- UINT32 get_rgb(UINT8 index);
-
-private:
- running_machine &machine() const
- {
- assert(m_machine != NULL);
- return *m_machine;
- }
-
- UINT8 m_color_counter;
- UINT8 m_red;
- UINT8 m_green;
-
- UINT8 m_address_register;
- UINT32 m_color_palette_RAM[256];
- UINT32 m_overlay_color[4];
- UINT8 m_read_mask_register;
- UINT8 m_blink_mask_register;
- UINT8 m_command_register;
- UINT8 m_control_test_register;
-
- running_machine *m_machine;
-};
-
-apollo_graphics::bt458::bt458(running_machine &running_machine)
+apollo_graphics_15i::bt458::bt458(running_machine &running_machine)
{
m_machine = &running_machine;
}
-void apollo_graphics::bt458::start()
+void apollo_graphics_15i::bt458::start()
{
- MLOG1(("start apollo_graphics::bt458"));
+ MLOG1(("start apollo_graphics_15i::bt458"));
}
-void apollo_graphics::bt458::reset()
+void apollo_graphics_15i::bt458::reset()
{
- MLOG1(("reset apollo_graphics::bt458"));
+ MLOG1(("reset apollo_graphics_15i::bt458"));
m_color_counter = 0;
m_red = 0;
@@ -354,7 +124,7 @@ void apollo_graphics::bt458::reset()
m_control_test_register = 0;
}
-void apollo_graphics::bt458::write(UINT8 data, UINT8 c10)
+void apollo_graphics_15i::bt458::write(UINT8 data, UINT8 c10)
{
MLOG1(("writing Bt458 data=%02x C1,C0=%d", data, c10));
switch (c10)
@@ -427,7 +197,7 @@ void apollo_graphics::bt458::write(UINT8 data, UINT8 c10)
}
}
-UINT8 apollo_graphics::bt458::read(UINT8 c10)
+UINT8 apollo_graphics_15i::bt458::read(UINT8 c10)
{
UINT8 data = 0xff;
@@ -498,165 +268,16 @@ UINT8 apollo_graphics::bt458::read(UINT8 c10)
return data;
}
-UINT32 apollo_graphics::bt458::get_rgb(UINT8 index)
+UINT32 apollo_graphics_15i::bt458::get_rgb(UINT8 index)
{
return m_color_palette_RAM[index];
}
-/*****************************************************************************
- INLINE FUNCTIONS
- *****************************************************************************/
-
-INLINE apollo_graphics *get_safe_token(device_t *device)
-{
- assert(device != NULL);
- assert(device->type() == APOLLO_GRAPHICS || device->type() == APOLLO_MONO19I );
- return (apollo_graphics *) downcast<apollo_graphics_15i *> (device)->token();
-}
-
-void apollo_graphics::device_start(running_machine &running_machine)
-{
- m_n_planes = 0;
- m_width = 0;
- m_height = 0;
- m_buffer_width = 0;
- m_buffer_height = 0;
-
- m_sr = 0;
- m_device_id = 0;
- m_write_enable_register = 0;
- m_rop_register = 0;
- m_diag_mem_request = 0;
- m_cr0 = 0;
- m_cr1 = 0;
- m_cr2 = 0;
- m_cr2b = 0;
- m_cr2_s_data = 0;
- m_cr2_s_plane = 0x00;
- m_cr2_d_plane = 0x0e;
- m_cr3a = 0;
- m_cr3b = 0;
- m_ad_result = 0;
- m_ad_pending = 0;
-
- m_lut_control = 0;
- m_lut_data = 0;
-
- m_update_flag = 0;
- m_update_pending = 0;
-
- m_blt_cycle_count = 0;
- m_image_offset = 0;
- memset(m_guard_latch, 0, sizeof(m_guard_latch));
-
- m_h_clock = 0;
- m_v_clock = 0;
- m_p_clock = 0;
- m_data_clock = 0;
-
- m_image_memory = 0;
- m_image_plane_size = 0;
- m_image_memory_size = 0;
-
- memset(m_color_lookup_table, 0, sizeof(m_color_lookup_table));
-
- m_lut_fifo = NULL;
- m_bt458 = NULL;
-
- m_machine = &running_machine;
-}
-
-void apollo_graphics::device_reset()
-{
- if (m_n_planes == 0)
- {
- if (apollo_config(APOLLO_CONF_MONO_19I))
- {
- // monochrome 1280x1024
- m_n_planes = 1;
- m_device_id = SCREEN_DEVICE_ID_19I;
- m_width = 1280;
- m_height = 1024;
- m_buffer_width = 2048;
- m_buffer_height = 1024;
- }
- else if (apollo_config(APOLLO_CONF_MONO_15I))
- {
- // monochrome 1024x800
- m_n_planes = 1;
- m_device_id = SCREEN_DEVICE_ID_15I;
- m_width = 1024;
- m_height = 800;
- m_buffer_width = 1024;
- m_buffer_height = 1024;
- }
- else if (apollo_config(APOLLO_CONF_4_PLANES))
- {
- // 4-planes color 1024x800
- m_n_planes = 4;
- m_device_id = SCREEN_DEVICE_ID_C4P;
- m_width = 1024;
- m_height = 800;
- m_buffer_width = 1024;
- m_buffer_height = 1024;
- }
- else
- {
- // 8-planes color 1024x800
- m_n_planes = 8;
- m_device_id = SCREEN_DEVICE_ID_C8P;
- m_width = 1024;
- m_height = 800;
- m_buffer_width = 1024;
- m_buffer_height = 1024;
-
- m_lut_fifo = new lut_fifo();
-
- m_bt458 = new bt458(*m_machine);
- m_bt458->start();
- m_bt458->reset();
- }
- }
-
- if (m_image_memory == NULL)
- {
- /* allocate the memory image */
- m_image_plane_size = m_buffer_height * m_buffer_width / 16;
- m_image_memory_size = m_image_plane_size * m_n_planes;
- m_image_memory
- = auto_alloc_array(machine(), UINT16, m_image_memory_size);
- assert(m_image_memory != NULL);
-
- MLOG1(("device reset apollo graphics: buffer=%p size=%0x", m_image_memory, m_image_memory_size));
- }
-
- memset(m_color_lookup_table, 0, sizeof(m_color_lookup_table));
- memset(m_image_memory, 0, m_image_memory_size * 2);
-
- // register_vblank_callback(this);
-}
-
-void apollo_graphics::device_reset_mono19i()
-{
- if (m_n_planes == 0)
- {
- // monochrome 1280x1024
- m_n_planes = 1;
- m_device_id = SCREEN_DEVICE_ID_19I;
- m_width = 1280;
- m_height = 1024;
- m_buffer_width = 2048;
- m_buffer_height = 1024;
- }
-
- device_reset();
-}
-
/***************************************************************************
Monochrome Controller Registers at 0x5d800 - 0x5dc07
***************************************************************************/
-const char *apollo_graphics::cr_text(offs_t offset, UINT8 data, UINT8 rw)
+const char *apollo_graphics_15i::cr_text(offs_t offset, UINT8 data, UINT8 rw)
{
static const char *cr0[8] =
{ "cr0 mode=0 CPU dest BLT", "cr0 mode=1 Alternating BLT",
@@ -708,9 +329,9 @@ const char *apollo_graphics::cr_text(offs_t offset, UINT8 data, UINT8 rw)
}
}
-void apollo_graphics::log_cr1(const char * text, device_t *device)
+void apollo_graphics_15i::log_cr1(const char * text)
{
- 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",
+ 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",
text,
m_cr0,
m_cr1,
@@ -728,7 +349,7 @@ void apollo_graphics::log_cr1(const char * text, device_t *device)
m_sr & SR_V_DATA ? 1 : 0));
}
-void apollo_graphics::increment_h_clock()
+void apollo_graphics_15i::increment_h_clock()
{
MLOG1(("increment_h_clock: sr=%02x m_h_clock=%d", m_sr, m_h_clock));
@@ -809,7 +430,7 @@ void apollo_graphics::increment_h_clock()
m_h_clock++;
}
-void apollo_graphics::increment_v_clock()
+void apollo_graphics_15i::increment_v_clock()
{
MLOG1(("increment_v_clock: sr=%02x m_v_clock=%d", m_sr, m_v_clock));
@@ -896,7 +517,7 @@ void apollo_graphics::increment_v_clock()
m_data_clock = 0;
}
-void apollo_graphics::increment_p_clock()
+void apollo_graphics_15i::increment_p_clock()
{
if (m_n_planes == 1)
{
@@ -954,7 +575,7 @@ void apollo_graphics::increment_p_clock()
}
}
-void apollo_graphics::set_cr1(device_t *device, UINT8 data)
+void apollo_graphics_15i::set_cr1(UINT8 data)
{
UINT8 diffs = m_cr1 ^ data;
m_cr1 = data;
@@ -992,31 +613,31 @@ void apollo_graphics::set_cr1(device_t *device, UINT8 data)
m_sr = SR_H_CK | SR_V_BLANK | SR_SYNC | SR_DONE;
}
}
- log_cr1("CR1_RESET", device);
+ log_cr1("CR1_RESET");
}
else
{
if ((diffs & CR1_RESET) && (m_cr1 & CR1_RESET) != 0)
{
- log_cr1("CR1_RESET", device);
+ log_cr1("CR1_RESET");
}
if (dh_clock)
{
increment_h_clock();
- log_cr1("CR1_DH_CK", device);
+ log_cr1("CR1_DH_CK");
}
if (dv_clock)
{
increment_v_clock();
- log_cr1("CR1_DV_CK", device);
+ log_cr1("CR1_DV_CK");
}
if (dp_clock)
{
increment_p_clock();
- log_cr1("CR1_DP_CK", device);
+ log_cr1("CR1_DP_CK");
}
if ((m_sr & SR_V_BLANK) == 0)
@@ -1032,7 +653,7 @@ void apollo_graphics::set_cr1(device_t *device, UINT8 data)
}
}
-void apollo_graphics::set_cr3a(device_t *device, UINT8 data)
+void apollo_graphics_15i::set_cr3a(UINT8 data)
{
m_cr3a = data;
if ((data & 0x80) == 0)
@@ -1041,16 +662,16 @@ void apollo_graphics::set_cr3a(device_t *device, UINT8 data)
UINT8 bit_mask = 1 << shift;
if (data & 0x01)
{
- set_cr1(device, m_cr1 | bit_mask);
+ set_cr1(m_cr1 | bit_mask);
}
else
{
- set_cr1(device, m_cr1 & ~bit_mask);
+ set_cr1(m_cr1 & ~bit_mask);
}
}
}
-void apollo_graphics::set_cr3b(device_t *device, UINT8 data)
+void apollo_graphics_15i::set_cr3b(UINT8 data)
{
m_cr3b = data;
if ((data & 0x80) == 0)
@@ -1059,23 +680,23 @@ void apollo_graphics::set_cr3b(device_t *device, UINT8 data)
UINT8 bit_mask = 1 << shift;
if (data & 0x01)
{
- set_lut_cr(device, m_lut_control | bit_mask);
+ set_lut_cr(m_lut_control | bit_mask);
}
else
{
- set_lut_cr(device, m_lut_control & ~bit_mask);
+ set_lut_cr(m_lut_control & ~bit_mask);
}
}
}
-void apollo_graphics::set_lut_cr(device_t *device, UINT8 data)
+void apollo_graphics_15i::set_lut_cr(UINT8 data)
{
UINT8 diffs = m_lut_control ^ data;
m_lut_control = data;
if ((diffs & LUT_CPAL_CS) && (data & LUT_CPAL_CS) != 0)
{
- DLOG1(("writing Color Graphics Controller: LUT_CPAL_CS Disabled"));
+ MLOG1(("writing Color Graphics Controller: LUT_CPAL_CS Disabled"));
while (!m_lut_fifo->is_empty())
{
m_bt458->write(m_lut_fifo->get(), LUT_C1_C0(m_lut_control));
@@ -1084,24 +705,24 @@ void apollo_graphics::set_lut_cr(device_t *device, UINT8 data)
if ((diffs & LUT_FIFO_RST) && (data & LUT_FIFO_RST) == 0)
{
- DLOG1(("writing Color Graphics Controller: LUT_FIFO_RST Active"));
+ MLOG1(("writing Color Graphics Controller: LUT_FIFO_RST Active"));
m_lut_fifo->reset();
m_sr |= SR_LUT_OK;
}
if ((diffs & LUT_FIFO_CS) && (data & LUT_FIFO_CS) == 0)
{
- DLOG1(("writing Color Graphics Controller: LUT_FIFO_CS Enabled"));
+ MLOG1(("writing Color Graphics Controller: LUT_FIFO_CS Enabled"));
}
if ((diffs & LUT_ST_LUK) && (data & LUT_ST_LUK) == 0)
{
- DLOG1(("writing Color Graphics Controller: LUT_ST_LUK Active"));
+ MLOG1(("writing Color Graphics Controller: LUT_ST_LUK Active"));
m_sr &= ~SR_LUT_OK;
}
}
-READ8_DEVICE_HANDLER( apollo_graphics::apollo_mcr_r )
+READ8_MEMBER( apollo_graphics_15i::apollo_mcr_r )
{
UINT8 data;
switch (offset & 0x407)
@@ -1140,15 +761,15 @@ READ8_DEVICE_HANDLER( apollo_graphics::apollo_mcr_r )
{
if (offset == 0)
status0 = data;
- DLOG1(("reading Graphics Controller at offset %03x = %02x (%s)", offset, data, cr_text(offset, data, 1)));
+ MLOG1(("reading Graphics Controller at offset %03x = %02x (%s)", offset, data, cr_text(offset, data, 1)));
}
return data;
}
-WRITE8_DEVICE_HANDLER( apollo_graphics::apollo_mcr_w )
+WRITE8_MEMBER( apollo_graphics_15i::apollo_mcr_w )
{
- DLOG1(("writing Graphics Controller at offset %03x = %02x (%s)", offset, data, cr_text(offset, data, 0)));
+ MLOG1(("writing Graphics Controller at offset %03x = %02x (%s)", offset, data, cr_text(offset, data, 0)));
switch (offset & 0x407)
{
case 0:
@@ -1176,7 +797,7 @@ WRITE8_DEVICE_HANDLER( apollo_graphics::apollo_mcr_w )
m_cr0 = data;
break;
case 0x402:
- set_cr1(device, data);
+ set_cr1(data);
break;
case 0x404:
m_cr2 = data;
@@ -1187,7 +808,7 @@ WRITE8_DEVICE_HANDLER( apollo_graphics::apollo_mcr_w )
m_sr |= SR_R_M_W;
break;
case 0x406:
- set_cr3a(device, data);
+ set_cr3a(data);
break;
case 0x407: // A/D Channel Register
m_ad_pending = 1;
@@ -1196,7 +817,7 @@ WRITE8_DEVICE_HANDLER( apollo_graphics::apollo_mcr_w )
}
}
-void apollo_graphics::set_status_rmw()
+void apollo_graphics_15i::set_status_rmw()
{
UINT8 plane, d_plane_bit;
UINT32 rop_reg;
@@ -1225,7 +846,7 @@ void apollo_graphics::set_status_rmw()
}
}
-UINT16 apollo_graphics::rop(UINT16 dest_data, UINT16 src_data, UINT8 plane)
+UINT16 apollo_graphics_15i::rop(UINT16 dest_data, UINT16 src_data, UINT8 plane)
{
UINT16 src_data1 = src_data;
if (m_cr1 & CR1_ROP_EN)
@@ -1285,7 +906,7 @@ UINT16 apollo_graphics::rop(UINT16 dest_data, UINT16 src_data, UINT8 plane)
return src_data;
}
-void apollo_graphics::set_source_data(UINT32 offset)
+void apollo_graphics_15i::set_source_data(UINT32 offset)
{
if (m_n_planes == 1 || (m_cr1 & CR1_AD_BIT))
{
@@ -1305,7 +926,7 @@ void apollo_graphics::set_source_data(UINT32 offset)
}
}
-UINT32 apollo_graphics::get_source_data(UINT8 plane)
+UINT32 apollo_graphics_15i::get_source_data(UINT8 plane)
{
UINT32 src_data;
@@ -1344,7 +965,7 @@ UINT32 apollo_graphics::get_source_data(UINT8 plane)
return src_data;
}
-void apollo_graphics::blt(UINT32 dest_addr, UINT16 mem_mask)
+void apollo_graphics_15i::blt(UINT32 dest_addr, UINT16 mem_mask)
{
UINT16 src_data, dest_data;
UINT8 d_plane_bit;
@@ -1372,7 +993,7 @@ void apollo_graphics::blt(UINT32 dest_addr, UINT16 mem_mask)
Color graphics memory space at A0000 - BFFFF
***************************************************************************/
-READ16_DEVICE_HANDLER( apollo_graphics::apollo_mem_r )
+READ16_MEMBER( apollo_graphics_15i::apollo_mem_r )
{
UINT16 data;
UINT32 src_addr;
@@ -1380,7 +1001,7 @@ READ16_DEVICE_HANDLER( apollo_graphics::apollo_mem_r )
if (offset >= m_image_memory_size)
{
// 128 kB display buffer of 15" screen seems to be shadowed from $fa0000 to $fc0000
- DLOG1(("reading Graphics Memory at invalid offset %05x", offset));
+ MLOG1(("reading Graphics Memory at invalid offset %05x", offset));
offset %= m_image_memory_size;
}
@@ -1402,16 +1023,16 @@ READ16_DEVICE_HANDLER( apollo_graphics::apollo_mem_r )
// omit excessive logging
if ((offset & (m_image_plane_size - 1)) < 8)
{
- DLOG1(("reading Graphics Memory with mode %d: src_addr %05x = %04x & %04x", CR0_MODE(m_cr0), src_addr, data, mem_mask));
+ MLOG1(("reading Graphics Memory with mode %d: src_addr %05x = %04x & %04x", CR0_MODE(m_cr0), src_addr, data, mem_mask));
}
else if ((offset & (m_image_plane_size - 1)) == 8)
{
- DLOG1(("..."));
+ MLOG1(("..."));
}
return data;
}
-WRITE16_DEVICE_HANDLER( apollo_graphics::apollo_mem_w )
+WRITE16_MEMBER( apollo_graphics_15i::apollo_mem_w )
{
UINT32 dest_addr;
UINT32 src_addr;
@@ -1419,18 +1040,18 @@ WRITE16_DEVICE_HANDLER( apollo_graphics::apollo_mem_w )
if (offset >= m_image_memory_size)
{
// 128 kB display buffer of 15" screen seems to be shadowed from $fa0000 to $fc0000
- DLOG1(("writing Graphics Memory at invalid offset %05x = %04x & %04x ", offset, data, mem_mask));
+ MLOG1(("writing Graphics Memory at invalid offset %05x = %04x & %04x ", offset, data, mem_mask));
offset %= m_image_memory_size;
}
// omit excessive logging
if (offset < 24)
{
- DLOG1(("writing Graphics Memory with mode %d: offset=%04x data=%04x mask=%04x", CR0_MODE(m_cr0), offset, data, mem_mask));
+ MLOG1(("writing Graphics Memory with mode %d: offset=%04x data=%04x mask=%04x", CR0_MODE(m_cr0), offset, data, mem_mask));
}
else if (offset == 24)
{
- DLOG1(("..."));
+ MLOG1(("..."));
}
switch (CR0_MODE(m_cr0))
@@ -1518,7 +1139,7 @@ WRITE16_DEVICE_HANDLER( apollo_graphics::apollo_mem_w )
break;
default:
- DLOG(("writing Graphics Memory - unexpected cr0 mode %d", CR0_MODE(m_cr0)))
+ MLOG(("writing Graphics Memory - unexpected cr0 mode %d", CR0_MODE(m_cr0)))
;
break;
}
@@ -1529,7 +1150,7 @@ WRITE16_DEVICE_HANDLER( apollo_graphics::apollo_mem_w )
Color Screen
***************************************************************************/
-READ8_DEVICE_HANDLER( apollo_graphics::apollo_ccr_r )
+READ8_MEMBER( apollo_graphics_15i::apollo_ccr_r )
{
UINT8 data;
@@ -1544,7 +1165,7 @@ READ8_DEVICE_HANDLER( apollo_graphics::apollo_ccr_r )
data = m_ad_result;
break;
default:
- return apollo_mcr_r(device, space, offset, mem_mask);
+ return apollo_mcr_r(space, offset, mem_mask);
}
}
else if (m_n_planes == 8)
@@ -1569,7 +1190,7 @@ READ8_DEVICE_HANDLER( apollo_graphics::apollo_ccr_r )
}
else if ((m_lut_control & LUT_R_W) == 0)
{
- DLOG1(("apollo_graphics::apollo_ccr_r: reading LUT data register with unexpected RW = 0 in LUT Control register"));
+ MLOG1(("apollo_graphics_15i::apollo_ccr_r: reading LUT data register with unexpected RW = 0 in LUT Control register"));
data = m_lut_data;
}
else if ((m_lut_control & LUT_AD_CS) == 0)
@@ -1582,7 +1203,7 @@ READ8_DEVICE_HANDLER( apollo_graphics::apollo_ccr_r )
}
else
{
- DLOG1(("apollo_graphics::apollo_ccr_r: reading LUT data register with unexpected CS in LUT Control register"));
+ MLOG1(("apollo_graphics_15i::apollo_ccr_r: reading LUT data register with unexpected CS in LUT Control register"));
data = m_lut_data;
}
break;
@@ -1603,7 +1224,7 @@ READ8_DEVICE_HANDLER( apollo_graphics::apollo_ccr_r )
data = m_cr3b;
break;
default:
- return apollo_mcr_r(device, space, offset, mem_mask);
+ return apollo_mcr_r(space, offset, mem_mask);
}
}
else
@@ -1617,13 +1238,13 @@ READ8_DEVICE_HANDLER( apollo_graphics::apollo_ccr_r )
{
if (offset == 0)
status1 = data;
- DLOG1(("reading Color Graphics Controller at offset %03x = %02x (%s)", offset, data, cr_text(offset, data, 1)));
+ MLOG1(("reading Color Graphics Controller at offset %03x = %02x (%s)", offset, data, cr_text(offset, data, 1)));
}
return data;
}
-UINT8 apollo_graphics::get_pixel(UINT32 offset, UINT16 mask)
+UINT8 apollo_graphics_15i::get_pixel(UINT32 offset, UINT16 mask)
{
UINT8 data = 0;
UINT16 *source_ptr = m_image_memory + offset;
@@ -1666,7 +1287,7 @@ UINT8 apollo_graphics::get_pixel(UINT32 offset, UINT16 mask)
// read the 4-plane ADC value for data
-UINT8 apollo_graphics::c4p_read_adc(UINT8 data)
+UINT8 apollo_graphics_15i::c4p_read_adc(UINT8 data)
{
UINT8 value = 0;
@@ -1720,7 +1341,7 @@ UINT8 apollo_graphics::c4p_read_adc(UINT8 data)
// read the 8-plane ADC value for data
-UINT8 apollo_graphics::c8p_read_adc(UINT8 data)
+UINT8 apollo_graphics_15i::c8p_read_adc(UINT8 data)
{
UINT8 value = 0;
@@ -1771,7 +1392,7 @@ UINT8 apollo_graphics::c8p_read_adc(UINT8 data)
return value;
}
-WRITE8_DEVICE_HANDLER( apollo_graphics::apollo_ccr_w )
+WRITE8_MEMBER( apollo_graphics_15i::apollo_ccr_w )
{
static const UINT8 rgb_value[16] =
{ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb,
@@ -1812,7 +1433,7 @@ WRITE8_DEVICE_HANDLER( apollo_graphics::apollo_ccr_w )
m_sr |= SR_DONE;
break;
default:
- apollo_mcr_w(device, space, offset, data, mem_mask);
+ apollo_mcr_w(space, offset, data, mem_mask);
return;
}
}
@@ -1844,7 +1465,7 @@ WRITE8_DEVICE_HANDLER( apollo_graphics::apollo_ccr_w )
m_lut_data = data;
if ((m_lut_control & LUT_R_W) == 1)
{
- DLOG1(("apollo_graphics::apollo_ccr_w: writing LUT data register with RW = 1 in LUT Control register"));
+ MLOG1(("apollo_graphics_15i::apollo_ccr_w: writing LUT data register with RW = 1 in LUT Control register"));
}
else if ((m_lut_control & LUT_AD_CS) == 0)
{
@@ -1862,12 +1483,12 @@ WRITE8_DEVICE_HANDLER( apollo_graphics::apollo_ccr_w )
}
else
{
- DLOG1(("apollo_graphics::apollo_ccr_w: writing LUT data register with unexpected CS in LUT Control register"));
+ MLOG1(("apollo_graphics_15i::apollo_ccr_w: writing LUT data register with unexpected CS in LUT Control register"));
}
break;
case 0x403:
// LUT control register
- set_lut_cr(device, data);
+ set_lut_cr(data);
break;
case 0x404:
// cr2a
@@ -1883,23 +1504,22 @@ WRITE8_DEVICE_HANDLER( apollo_graphics::apollo_ccr_w )
break;
case 0x407:
// cr3b
- set_cr3b(device, data);
+ set_cr3b(data);
break;
default:
- apollo_mcr_w(device, space, offset, data, mem_mask);
+ apollo_mcr_w(space, offset, data, mem_mask);
return;
}
}
- DLOG1(("writing Color Graphics Controller at offset %03x = %02x (%s)", offset, data, cr_text(offset, data, 0)));
+ MLOG1(("writing Color Graphics Controller at offset %03x = %02x (%s)", offset, data, cr_text(offset, data, 0)));
}
-READ16_DEVICE_HANDLER( apollo_cgm_r )
+READ16_MEMBER( apollo_graphics_15i::apollo_cgm_r )
{
- apollo_graphics *apollo_graphics = get_safe_token(device);
- if (!apollo_graphics->is_mono())
+ if (!is_mono())
{
- return apollo_graphics->apollo_mem_r(device, space, offset, mem_mask);
+ return apollo_mem_r(space, offset, mem_mask);
}
else
{
@@ -1907,12 +1527,11 @@ READ16_DEVICE_HANDLER( apollo_cgm_r )
}
}
-WRITE16_DEVICE_HANDLER( apollo_cgm_w )
+WRITE16_MEMBER( apollo_graphics_15i::apollo_cgm_w )
{
- apollo_graphics *apollo_graphics = get_safe_token(device);
- if (!apollo_graphics->is_mono())
+ if (!is_mono())
{
- apollo_graphics->apollo_mem_w(device, space, offset, data, mem_mask);
+ apollo_mem_w(space, offset, data, mem_mask);
}
}
@@ -1920,8 +1539,7 @@ WRITE16_DEVICE_HANDLER( apollo_cgm_w )
VIDEO HARDWARE
***************************************************************************/
-UINT32 apollo_graphics::screen_update(bitmap_rgb32 &bitmap,
- const rectangle &cliprect)
+UINT32 apollo_graphics_15i::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
int has_changed = 0;
@@ -1936,8 +1554,7 @@ UINT32 apollo_graphics::screen_update(bitmap_rgb32 &bitmap,
return has_changed ? 0 : UPDATE_HAS_NOT_CHANGED;
}
-void apollo_graphics::screen_update1(bitmap_rgb32 &bitmap,
- const rectangle &cliprect)
+void apollo_graphics_15i::screen_update1(bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
UINT16 *source_ptr = m_image_memory;
int x, y;
@@ -2041,8 +1658,7 @@ void apollo_graphics::screen_update1(bitmap_rgb32 &bitmap,
called on each state change of the VBLANK signal
-------------------------------------------------*/
-void apollo_graphics::vblank_state_changed(device_t *device,
- screen_device &screen, bool vblank_state)
+void apollo_graphics_15i::vblank_state_changed(screen_device &screen, bool vblank_state)
{
if ((m_cr1 & CR1_RESET) && (m_cr1 & CR1_SYNC_EN))
{
@@ -2077,29 +1693,15 @@ void apollo_graphics::vblank_state_changed(device_t *device,
}
}
-void vblank_state_changed(device_t *device, screen_device &screen,
- bool vblank_state)
+void apollo_graphics_15i::register_vblank_callback()
{
- apollo_graphics *apollo_graphics = get_safe_token(device);
- apollo_graphics->vblank_state_changed(device, screen, vblank_state);
-}
-
-static void register_vblank_callback(device_t *device)
-{
- DLOG1(("register_vblank_callback"));
+ MLOG1(("register_vblank_callback"));
/* register for VBLANK callbacks */
- screen_device *screen = (screen_device *) device->machine().device(
- VIDEO_SCREEN_TAG);
- screen->register_vblank_callback(vblank_state_delegate(
- FUNC(vblank_state_changed),device) );
+ screen_device *screen = (screen_device *)machine().device(VIDEO_SCREEN_TAG);
+ screen->register_vblank_callback(vblank_state_delegate(FUNC(apollo_graphics_15i::vblank_state_changed),this));
}
-UINT32 apollo_graphics_15i::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
-{
- apollo_graphics *apollo_graphics = get_safe_token(this);
- return apollo_graphics->screen_update(bitmap, cliprect);
-}
/***************************************************************************
MACHINE DRIVERS
@@ -2118,25 +1720,25 @@ MACHINE_CONFIG_END
const device_type APOLLO_GRAPHICS = &device_creator<apollo_graphics_15i> ;
-apollo_graphics_15i::apollo_graphics_15i(const machine_config &mconfig,
- const char *tag, device_t *owner, UINT32 clock) :
- device_t(mconfig, APOLLO_GRAPHICS, "Apollo Screen", tag, owner, clock,
- "apollo_graphics_15i", __FILE__)
+apollo_graphics_15i::apollo_graphics_15i(const machine_config &mconfig,const char *tag, device_t *owner, UINT32 clock) :
+ device_t(mconfig, APOLLO_GRAPHICS, "Apollo Screen", tag, owner, clock,"apollo_graphics_15i", __FILE__),
+ m_lut_fifo(NULL),
+ m_bt458(NULL)
{
- m_token = new apollo_graphics;
+
}
-apollo_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) :
- device_t(mconfig, type, name, tag, owner, clock, shortname, source)
+apollo_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) :
+ device_t(mconfig, type, name, tag, owner, clock, shortname, source),
+ m_lut_fifo(NULL),
+ m_bt458(NULL)
{
- m_token = new apollo_graphics;
}
apollo_graphics_15i::~apollo_graphics_15i()
{
- global_free(m_token);
+ if (m_lut_fifo) global_free(m_lut_fifo);
+ if (m_bt458) global_free(m_bt458);
}
//-------------------------------------------------
@@ -2157,8 +1759,52 @@ void apollo_graphics_15i::device_start()
{
MLOG1(("apollo_graphics_15i::device_start"))
- apollo_graphics *apollo_graphics = get_safe_token(this);
- apollo_graphics->device_start(machine());
+ m_n_planes = 0;
+ m_width = 0;
+ m_height = 0;
+ m_buffer_width = 0;
+ m_buffer_height = 0;
+
+ m_sr = 0;
+ m_device_id = 0;
+ m_write_enable_register = 0;
+ m_rop_register = 0;
+ m_diag_mem_request = 0;
+ m_cr0 = 0;
+ m_cr1 = 0;
+ m_cr2 = 0;
+ m_cr2b = 0;
+ m_cr2_s_data = 0;
+ m_cr2_s_plane = 0x00;
+ m_cr2_d_plane = 0x0e;
+ m_cr3a = 0;
+ m_cr3b = 0;
+ m_ad_result = 0;
+ m_ad_pending = 0;
+
+ m_lut_control = 0;
+ m_lut_data = 0;
+
+ m_update_flag = 0;
+ m_update_pending = 0;
+
+ m_blt_cycle_count = 0;
+ m_image_offset = 0;
+ memset(m_guard_latch, 0, sizeof(m_guard_latch));
+
+ m_h_clock = 0;
+ m_v_clock = 0;
+ m_p_clock = 0;
+ m_data_clock = 0;
+
+ m_image_memory = 0;
+ m_image_plane_size = 0;
+ m_image_memory_size = 0;
+
+ memset(m_color_lookup_table, 0, sizeof(m_color_lookup_table));
+
+ m_lut_fifo = NULL;
+ m_bt458 = NULL;
}
//-------------------------------------------------
@@ -2169,23 +1815,78 @@ void apollo_graphics_15i::device_reset()
{
MLOG1(("apollo_graphics_15i::device_reset"));
- apollo_graphics *apollo_graphics = get_safe_token(this);
- apollo_graphics->device_reset();
+ if (m_n_planes == 0)
+ {
+ if (apollo_config(APOLLO_CONF_MONO_19I))
+ {
+ // monochrome 1280x1024
+ m_n_planes = 1;
+ m_device_id = SCREEN_DEVICE_ID_19I;
+ m_width = 1280;
+ m_height = 1024;
+ m_buffer_width = 2048;
+ m_buffer_height = 1024;
+ }
+ else if (apollo_config(APOLLO_CONF_MONO_15I))
+ {
+ // monochrome 1024x800
+ m_n_planes = 1;
+ m_device_id = SCREEN_DEVICE_ID_15I;
+ m_width = 1024;
+ m_height = 800;
+ m_buffer_width = 1024;
+ m_buffer_height = 1024;
+ }
+ else if (apollo_config(APOLLO_CONF_4_PLANES))
+ {
+ // 4-planes color 1024x800
+ m_n_planes = 4;
+ m_device_id = SCREEN_DEVICE_ID_C4P;
+ m_width = 1024;
+ m_height = 800;
+ m_buffer_width = 1024;
+ m_buffer_height = 1024;
+ }
+ else
+ {
+ // 8-planes color 1024x800
+ m_n_planes = 8;
+ m_device_id = SCREEN_DEVICE_ID_C8P;
+ m_width = 1024;
+ m_height = 800;
+ m_buffer_width = 1024;
+ m_buffer_height = 1024;
- /* FIXME: register for VBLANK callbacks */
- register_vblank_callback(this);
-}
+ if (m_lut_fifo) global_free(m_lut_fifo);
+ if (m_bt458) global_free(m_bt458);
-READ8_DEVICE_HANDLER( apollo_ccr_r )
-{
- apollo_graphics *apollo_graphics = get_safe_token(device);
- return apollo_graphics->apollo_ccr_r(device, space, offset, mem_mask);
-}
+ m_lut_fifo = global_alloc(lut_fifo);
-WRITE8_DEVICE_HANDLER( apollo_ccr_w )
-{
- apollo_graphics *apollo_graphics = get_safe_token(device);
- apollo_graphics->apollo_ccr_w(device, space, offset, data, mem_mask);
+ m_bt458 = global_alloc(bt458(machine()));
+ m_bt458->start();
+ m_bt458->reset();
+ }
+ }
+
+ if (m_image_memory == NULL)
+ {
+ /* allocate the memory image */
+ m_image_plane_size = m_buffer_height * m_buffer_width / 16;
+ m_image_memory_size = m_image_plane_size * m_n_planes;
+ m_image_memory
+ = auto_alloc_array(machine(), UINT16, m_image_memory_size);
+ assert(m_image_memory != NULL);
+
+ MLOG1(("device reset apollo graphics: buffer=%p size=%0x", m_image_memory, m_image_memory_size));
+ }
+
+ memset(m_color_lookup_table, 0, sizeof(m_color_lookup_table));
+ memset(m_image_memory, 0, m_image_memory_size * 2);
+
+ // register_vblank_callback(this);
+
+ /* FIXME: register for VBLANK callbacks */
+ register_vblank_callback();
}
//-------------------------------------------------
@@ -2240,31 +1941,29 @@ void apollo_graphics_19i::device_reset()
{
MLOG1(("apollo_graphics_19i::device_reset"));
- apollo_graphics *apollo_graphics = get_safe_token(this);
- apollo_graphics->device_reset_mono19i();
+ if (m_n_planes == 0)
+ {
+ // monochrome 1280x1024
+ m_n_planes = 1;
+ m_device_id = SCREEN_DEVICE_ID_19I;
+ m_width = 1280;
+ m_height = 1024;
+ m_buffer_width = 2048;
+ m_buffer_height = 1024;
+ }
- /* FIXME: register for VBLANK callbacks */
- register_vblank_callback(this);
-}
+ apollo_graphics_15i::device_reset();
-READ8_DEVICE_HANDLER( apollo_mcr_r )
-{
- apollo_graphics *apollo_graphics = get_safe_token(device);
- return apollo_graphics->apollo_mcr_r(device, space, offset, mem_mask);
+ /* FIXME: register for VBLANK callbacks */
+ register_vblank_callback();
}
-WRITE8_DEVICE_HANDLER( apollo_mcr_w )
-{
- apollo_graphics *apollo_graphics = get_safe_token(device);
- apollo_graphics->apollo_mcr_w(device, space, offset, data, mem_mask);
-}
-READ16_DEVICE_HANDLER( apollo_mgm_r )
-{
- apollo_graphics *apollo_graphics = get_safe_token(device);
- if (apollo_graphics->is_mono())
+READ16_MEMBER( apollo_graphics_15i::apollo_mgm_r )
+{
+ if (is_mono())
{
- return apollo_graphics->apollo_mem_r(device, space, offset, mem_mask);
+ return apollo_mem_r(space, offset, mem_mask);
}
else
{
@@ -2272,11 +1971,10 @@ READ16_DEVICE_HANDLER( apollo_mgm_r )
}
}
-WRITE16_DEVICE_HANDLER( apollo_mgm_w )
+WRITE16_MEMBER( apollo_graphics_15i::apollo_mgm_w )
{
- apollo_graphics *apollo_graphics = get_safe_token(device);
- if (apollo_graphics->is_mono())
+ if (is_mono())
{
- apollo_graphics->apollo_mem_w(device, space, offset, data, mem_mask);
+ apollo_mem_w(space, offset, data, mem_mask);
}
}