summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/video/pwm.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/video/pwm.h')
-rw-r--r--src/devices/video/pwm.h30
1 files changed, 19 insertions, 11 deletions
diff --git a/src/devices/video/pwm.h b/src/devices/video/pwm.h
index 91d70521da9..ee1bf8239e8 100644
--- a/src/devices/video/pwm.h
+++ b/src/devices/video/pwm.h
@@ -29,29 +29,35 @@ public:
// output callbacks when not using the default output tags
auto output_x() { return m_output_x_cb.bind(); } // x = offset >> 6, y = offset & 0x3f
auto output_a() { return m_output_a_cb.bind(); }
+ auto output_multi() { return m_output_multi_cb.bind(); } // b = offset >> 6, y = offset & 0x3f
auto output_digit() { return m_output_digit_cb.bind(); }
void reset_bri_levels() { std::fill(std::begin(m_levels), std::end(m_levels), 1.0); }
void set_bri_one(u8 i, double level) { m_levels[i] = level; }
void segmask_one(u8 y, u64 mask) { m_segmask[y] = mask; }
- void matrix_partial(u8 start, u8 height, u64 rowsel, u64 rowdata, bool upd = true);
- void matrix(u64 rowsel, u64 rowdata, bool upd = true) { matrix_partial(0, m_height, rowsel, rowdata, upd); }
- void update(); // apply changes to m_rowdata
+ // matrix accessors
+ void matrix_partial(u8 start, u8 height, u64 rowsel, u64 rowdata);
+ void matrix(u64 rowsel, u64 rowdata) { matrix_partial(0, m_height, rowsel, rowdata); }
void clear() { matrix(0, 0); }
+ void write_my(u64 y) { matrix(y, m_rowdata_last); }
+ void write_mx(u64 x) { matrix(m_rowsel, x); }
+ u64 read_my() { return m_rowsel; }
+ u64 read_mx() { return m_rowdata_last; }
+
// directly handle individual element (does not affect m_rowsel), y = row num, x = row bit
int read_element(u8 y, u8 x) { return BIT(m_rowdata[y], x); }
- void write_element(u8 y, u8 x, int state) { m_rowdata[y] = (m_rowdata[y] & ~(u64(1) << x)) | (u64(state ? 1 : 0) << x); }
+ void write_element(u8 y, u8 x, int state) { sync(); m_rowdata[y] = (m_rowdata[y] & ~(u64(1) << x)) | (u64(state ? 1 : 0) << x); }
// directly handle row data
u64 read_row(offs_t offset) { return m_rowdata[offset]; }
- void write_row(offs_t offset, u64 data) { m_rowdata[offset] = data; m_rowsel |= u64(1) << offset; }
- void clear_row(offs_t offset, u64 data = 0) { m_rowdata[offset] = 0; m_rowsel &= ~(u64(1) << offset); }
+ void write_row(offs_t offset, u64 data) { sync(); m_rowdata[offset] = data; m_rowsel |= u64(1) << offset; }
+ void clear_row(offs_t offset, u64 data = 0) { sync(); m_rowdata[offset] = 0; m_rowsel &= ~(u64(1) << offset); }
// directly handle element current brightness
- double read_element_bri(u8 y, u8 x) { return m_bri[y][x]; }
- void write_element_bri(u8 y, u8 x, double b) { m_bri[y][x] = b; }
+ double read_element_bri(u8 y, u8 x) { sync(); return m_bri[y][x]; }
+ void write_element_bri(u8 y, u8 x, double b) { sync(); m_bri[y][x] = b; }
bool element_on(u8 y, u8 x) { return (read_element_bri(y, x) > m_levels[m_level_min]); }
bool row_on(u8 y) { return element_on(y, m_width); }
@@ -63,10 +69,12 @@ protected:
private:
output_finder<0x40, 0x40> m_out_x;
output_finder<0x40> m_out_a;
+ output_finder<0x40, 0x40> m_out_multi;
output_finder<0x40> m_out_digit;
devcb_write8 m_output_x_cb;
devcb_write8 m_output_a_cb;
+ devcb_write64 m_output_multi_cb;
devcb_write64 m_output_digit_cb;
bool m_external_output;
@@ -81,17 +89,17 @@ private:
u64 m_segmask[0x40];
u64 m_rowsel;
- u64 m_rowsel_prev;
u64 m_rowdata[0x40];
- u64 m_rowdata_prev[0x40];
+ u64 m_rowdata_last;
double m_bri[0x40][0x41];
- attotime m_update_time;
+ attotime m_sync_time;
attotime m_acc[0x40][0x41];
emu_timer *m_frame_timer;
TIMER_CALLBACK_MEMBER(frame_tick);
void schedule_frame();
+ void sync();
};