summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2018-07-11 19:19:12 -0400
committer AJR <ajrhacker@users.noreply.github.com>2018-07-11 19:19:12 -0400
commit00579c63a31f667844d0b7bcf5565707a94a8dc4 (patch)
tree9525f77aa2f0618ad186ecf93b53ba95ec610931
parent7860c918a335a67adb338f69470d0921f2dfe7db (diff)
crt9007: Save state (nw)
-rw-r--r--src/devices/video/crt9007.cpp136
-rw-r--r--src/devices/video/crt9007.h34
2 files changed, 111 insertions, 59 deletions
diff --git a/src/devices/video/crt9007.cpp b/src/devices/video/crt9007.cpp
index e185f405349..45455aaee23 100644
--- a/src/devices/video/crt9007.cpp
+++ b/src/devices/video/crt9007.cpp
@@ -274,7 +274,7 @@ inline void crt9007_device::update_cblank_line()
int y = screen().vpos();
// composite blank
- int cblank = !(m_hs & m_vs);
+ bool cblank = !(m_hs && m_vs);
if (m_cblank != cblank)
{
@@ -291,7 +291,7 @@ inline void crt9007_device::update_cblank_line()
// update_hsync_timer -
//-------------------------------------------------
-inline void crt9007_device::update_hsync_timer(int state)
+inline void crt9007_device::update_hsync_timer(bool state)
{
int y = screen().vpos();
@@ -308,7 +308,7 @@ inline void crt9007_device::update_hsync_timer(int state)
// update_vsync_timer -
//-------------------------------------------------
-inline void crt9007_device::update_vsync_timer(int state)
+inline void crt9007_device::update_vsync_timer(bool state)
{
int next_y = state ? m_vsync_start : m_vsync_end;
@@ -322,7 +322,7 @@ inline void crt9007_device::update_vsync_timer(int state)
// update_vlt_timer -
//-------------------------------------------------
-inline void crt9007_device::update_vlt_timer(int state)
+inline void crt9007_device::update_vlt_timer(bool state)
{
// this signal is active during all visible scan lines and during the horizontal trace at vertical retrace
int y = screen().vpos();
@@ -340,7 +340,7 @@ inline void crt9007_device::update_vlt_timer(int state)
// update_curs_timer -
//-------------------------------------------------
-inline void crt9007_device::update_curs_timer(int state)
+inline void crt9007_device::update_curs_timer(bool state)
{
// this signal is active for 1 character time for all scanlines within the data row
// TODO
@@ -351,7 +351,7 @@ inline void crt9007_device::update_curs_timer(int state)
// update_drb_timer -
//-------------------------------------------------
-inline void crt9007_device::update_drb_timer(int state)
+inline void crt9007_device::update_drb_timer(bool state)
{
// this signal is active for 1 full scan line (VLT edge to edge) at the top scan line of each new row
// there is 1 extra DRB signal during the 1st scanline of the vertical retrace interval
@@ -473,19 +473,13 @@ crt9007_device::crt9007_device(const machine_config &mconfig, const char *tag, d
//-------------------------------------------------
-// device_start - device-specific startup
+// device_resolve_objects - resolve objects that
+// may be needed for other devices to set
+// initial conditions at start time
//-------------------------------------------------
-void crt9007_device::device_start()
+void crt9007_device::device_resolve_objects()
{
- // allocate timers
- m_hsync_timer = timer_alloc(TIMER_HSYNC);
- m_vsync_timer = timer_alloc(TIMER_VSYNC);
- m_vlt_timer = timer_alloc(TIMER_VLT);
- m_curs_timer = timer_alloc(TIMER_CURS);
- m_drb_timer = timer_alloc(TIMER_DRB);
- m_dma_timer = timer_alloc(TIMER_DMA);
-
// resolve callbacks
m_write_int.resolve_safe();
m_write_dmar.resolve_safe();
@@ -502,19 +496,48 @@ void crt9007_device::device_start()
//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void crt9007_device::device_start()
+{
+ // allocate timers
+ m_hsync_timer = timer_alloc(TIMER_HSYNC);
+ m_vsync_timer = timer_alloc(TIMER_VSYNC);
+ m_vlt_timer = timer_alloc(TIMER_VLT);
+ m_curs_timer = timer_alloc(TIMER_CURS);
+ m_drb_timer = timer_alloc(TIMER_DRB);
+ m_dma_timer = timer_alloc(TIMER_DMA);
+
+ // save state
+ save_item(NAME(m_reg));
+ save_item(NAME(m_status));
+ save_item(NAME(m_hpixels_per_column));
+ save_item(NAME(m_disp));
+ save_item(NAME(m_hs));
+ save_item(NAME(m_vs));
+ save_item(NAME(m_cblank));
+ save_item(NAME(m_vlt));
+ save_item(NAME(m_drb));
+ save_item(NAME(m_lpstb));
+}
+
+
+//-------------------------------------------------
// device_reset - device-specific reset
//-------------------------------------------------
void crt9007_device::device_reset()
{
- m_disp = 0;
- m_vs = 0;
- m_cblank = 0;
+ m_disp = false;
+ m_cblank = false;
// HS = 1
+ m_hs = true;
m_write_hs(1);
// VS = 1
+ m_vs = true;
m_write_vs(1);
// CBLANK = 1
@@ -549,6 +572,18 @@ void crt9007_device::device_reset()
//-------------------------------------------------
+// device_post_load - called after the loading a
+// saved state, so that registered variables can
+// be expanded as necessary
+//-------------------------------------------------
+
+void crt9007_device::device_post_load()
+{
+ recompute_parameters();
+}
+
+
+//-------------------------------------------------
// device_clock_changed - handle clock change
//-------------------------------------------------
@@ -570,7 +605,7 @@ void crt9007_device::device_timer(emu_timer &timer, device_timer_id id, int para
switch (id)
{
case TIMER_HSYNC:
- m_hs = param;
+ m_hs = bool(param);
LOG("CRT9007 y %03u x %04u : HS %u\n", y, x, m_hs);
@@ -578,15 +613,15 @@ void crt9007_device::device_timer(emu_timer &timer, device_timer_id id, int para
update_cblank_line();
- update_hsync_timer(param);
+ update_hsync_timer(m_hs);
break;
case TIMER_VSYNC:
- m_vs = param;
+ m_vs = bool(param);
LOG("CRT9007 y %03u x %04u : VS %u\n", y, x, m_vs);
- m_write_vs(param);
+ m_write_vs(m_vs);
if (m_vs)
{
@@ -600,17 +635,17 @@ void crt9007_device::device_timer(emu_timer &timer, device_timer_id id, int para
update_cblank_line();
}
- update_vsync_timer(param);
+ update_vsync_timer(m_vs);
break;
case TIMER_VLT:
- m_vlt = param;
+ m_vlt = bool(param);
LOG("CRT9007 y %03u x %04u : VLT %u\n", y, x, m_vlt);
- m_write_vlt(param);
+ m_write_vlt(m_vlt);
- update_vlt_timer(param);
+ update_vlt_timer(m_vlt);
break;
case TIMER_CURS:
@@ -622,11 +657,11 @@ void crt9007_device::device_timer(emu_timer &timer, device_timer_id id, int para
break;
case TIMER_DRB:
- m_drb = param;
+ m_drb = bool(param);
LOG("CRT9007 y %03u x %04u : DRB %u\n", y, x, m_drb);
- m_write_drb(param);
+ m_write_drb(m_drb);
if (!m_drb && !DMA_DISABLE)
{
@@ -640,7 +675,7 @@ void crt9007_device::device_timer(emu_timer &timer, device_timer_id id, int para
m_write_dmar(ASSERT_LINE);
}
- update_drb_timer(param);
+ update_drb_timer(m_drb);
break;
case TIMER_DMA:
@@ -676,13 +711,19 @@ READ8_MEMBER( crt9007_device::read )
switch (offset)
{
case 0x15:
- LOG("CRT9007 Start\n");
- m_disp = 1;
+ if (!machine().side_effects_disabled())
+ {
+ LOG("CRT9007 Start\n");
+ m_disp = true;
+ }
break;
case 0x16:
- LOG("CRT9007 Reset\n");
- device_reset();
+ if (!machine().side_effects_disabled())
+ {
+ LOG("CRT9007 Reset\n");
+ device_reset();
+ }
break;
case 0x38:
@@ -696,10 +737,13 @@ READ8_MEMBER( crt9007_device::read )
case 0x3a:
data = m_status;
- // reset interrupt pending bit
- m_status &= ~STATUS_INTERRUPT_PENDING;
- LOG("CRT9007 INT 0\n");
- m_write_int(CLEAR_LINE);
+ if (!machine().side_effects_disabled())
+ {
+ // reset interrupt pending bit
+ m_status &= ~STATUS_INTERRUPT_PENDING;
+ LOG("CRT9007 INT 0\n");
+ m_write_int(CLEAR_LINE);
+ }
break;
case 0x3b:
@@ -709,12 +753,16 @@ READ8_MEMBER( crt9007_device::read )
case 0x3c:
data = HORIZONTAL_LIGHT_PEN;
- // reset light pen update bit
- m_status &= ~STATUS_LIGHT_PEN_UPDATE;
+ if (!machine().side_effects_disabled())
+ {
+ // reset light pen update bit
+ m_status &= ~STATUS_LIGHT_PEN_UPDATE;
+ }
break;
default:
- logerror("CRT9007 Read from Invalid Register: %02x!\n", offset);
+ if (!machine().side_effects_disabled())
+ logerror("CRT9007 Read from Invalid Register: %02x!\n", offset);
}
return data;
@@ -834,7 +882,7 @@ WRITE8_MEMBER( crt9007_device::write )
case 0x15:
LOG("CRT9007 Start\n");
- m_disp = 1;
+ m_disp = true;
break;
case 0x16:
@@ -898,7 +946,7 @@ WRITE_LINE_MEMBER( crt9007_device::lpstb_w )
// TODO latch current row/column position
}
- m_lpstb = state;
+ m_lpstb = bool(state);
}
@@ -906,7 +954,7 @@ WRITE_LINE_MEMBER( crt9007_device::lpstb_w )
// set_character_width -
//-------------------------------------------------
-void crt9007_device::set_character_width(int value)
+void crt9007_device::set_character_width(unsigned value)
{
m_hpixels_per_column = value;
diff --git a/src/devices/video/crt9007.h b/src/devices/video/crt9007.h
index 060fbfcec24..51f192c38e3 100644
--- a/src/devices/video/crt9007.h
+++ b/src/devices/video/crt9007.h
@@ -93,7 +93,7 @@ public:
// construction/destruction
crt9007_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- void config_set_character_width(int value) { m_hpixels_per_column = value; }
+ void config_set_character_width(unsigned value) { m_hpixels_per_column = value; }
template <class Object> devcb_base &set_int_wr_callback(Object &&cb) { return m_write_int.set_callback(std::forward<Object>(cb)); }
template <class Object> devcb_base &set_dmar_wr_callback(Object &&cb) { return m_write_dmar.set_callback(std::forward<Object>(cb)); }
@@ -110,15 +110,17 @@ public:
DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write );
- void set_character_width(int value);
+ void set_character_width(unsigned value);
DECLARE_WRITE_LINE_MEMBER( ack_w );
DECLARE_WRITE_LINE_MEMBER( lpstb_w );
protected:
// device-level overrides
+ virtual void device_resolve_objects() override;
virtual void device_start() override;
virtual void device_reset() override;
+ virtual void device_post_load() override;
virtual void device_clock_changed() override;
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
@@ -142,11 +144,11 @@ private:
inline void trigger_interrupt(int line);
inline void update_cblank_line();
- inline void update_hsync_timer(int state);
- inline void update_vsync_timer(int state);
- inline void update_vlt_timer(int state);
- inline void update_curs_timer(int state);
- inline void update_drb_timer(int state);
+ inline void update_hsync_timer(bool state);
+ inline void update_vsync_timer(bool state);
+ inline void update_vlt_timer(bool state);
+ inline void update_curs_timer(bool state);
+ inline void update_drb_timer(bool state);
inline void update_dma_timer();
inline void recompute_parameters();
@@ -170,8 +172,16 @@ private:
uint8_t m_reg[0x3d];
uint8_t m_status;
- int m_disp;
- int m_hpixels_per_column;
+ uint8_t m_hpixels_per_column;
+
+ // booleans
+ bool m_disp;
+ bool m_hs;
+ bool m_vs;
+ bool m_cblank;
+ bool m_vlt;
+ bool m_drb;
+ bool m_lpstb;
// runtime variables, do not state save
int m_vsync_start;
@@ -182,15 +192,9 @@ private:
int m_vlt_end;
int m_vlt_bottom;
int m_drb_bottom;
- int m_hs;
- int m_vs;
- int m_cblank;
- int m_vlt;
- int m_drb;
//int m_wben;
//int m_slg;
//int m_sld;
- int m_lpstb;
// DMA
int m_dmar;