summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/video
diff options
context:
space:
mode:
author Jean-François DEL NERO <jeanfrancoisdelnero@free.fr>2016-01-24 22:47:05 +0100
committer Jean-François DEL NERO <jeanfrancoisdelnero@free.fr>2016-01-24 22:47:05 +0100
commit9fbef59621ff6e833cdbad717b3ee1551be35ff1 (patch)
tree8efc8a5c579a378482b2f9a705b147935cb9c26e /src/devices/video
parent21ea5a74e700189b8d38a97d74a82ca34ce3ea47 (diff)
Cursor support.
Diffstat (limited to 'src/devices/video')
-rw-r--r--src/devices/video/ef9364.cpp43
-rw-r--r--src/devices/video/ef9364.h2
2 files changed, 40 insertions, 5 deletions
diff --git a/src/devices/video/ef9364.cpp b/src/devices/video/ef9364.cpp
index b44909571e5..b850f05d531 100644
--- a/src/devices/video/ef9364.cpp
+++ b/src/devices/video/ef9364.cpp
@@ -125,6 +125,9 @@ void ef9364_device::device_start()
m_screen_out.allocate( bitplane_xres, m_screen->height() );
+ cursor_cnt = 0;
+ cursor_state = 0;
+
save_item(NAME(m_border));
save_item(NAME(m_screen_out));
@@ -199,16 +202,30 @@ UINT32 ef9364_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
{
for( x = 0 ; x < EF9364_NB_OF_COLUMNS * 8 ; x++ )
{
- c = m_textram->read_byte( ( r * EF9364_NB_OF_COLUMNS ) + ( x>>3 ) );
+ if( ( ( x >> 3 ) != x_curs_pos ) || ( r != y_curs_pos ) || !cursor_state)
+ {
+ c = m_textram->read_byte( ( r * EF9364_NB_OF_COLUMNS ) + ( x>>3 ) );
- if( m_charset->u8(((c&0x7F)<<3) + y ) & (0x80>>(x&7)) )
- m_screen_out.pix32((r*12)+y, x) = palette[1];
+ if( m_charset->u8(((c&0x7F)<<3) + y ) & (0x80>>(x&7)) )
+ m_screen_out.pix32((r*12)+y, x) = palette[1];
+ else
+ m_screen_out.pix32((r*12)+y, x) = palette[0];
+ }
else
- m_screen_out.pix32((r*12)+y, x) = palette[0];
+ {
+ if(y != 7)
+ m_screen_out.pix32((r*12)+y, x) = palette[0];
+ else
+ m_screen_out.pix32((r*12)+y, x) = palette[1];
+ }
}
}
}
+ cursor_cnt = (cursor_cnt + 1) % 13;
+ if(!cursor_cnt)
+ cursor_state ^= 1;
+
copybitmap(bitmap, m_screen_out, 0, 0, 0, 0, cliprect);
return 0;
}
@@ -240,7 +257,7 @@ void ef9364_device::command_w(UINT8 cmd)
switch( cmd&7 )
{
- case 0x0: // Page Erase ² Cursor hiom
+ case 0x0: // Page Erase & Cursor home
for( y=0 ; y < EF9364_NB_OF_ROWS ; y++ )
{
for( x=0 ; x < EF9364_NB_OF_COLUMNS ; x++ )
@@ -313,7 +330,23 @@ void ef9364_device::command_w(UINT8 cmd)
x_curs_pos=0;
y_curs_pos++;
if( y_curs_pos >= EF9364_NB_OF_ROWS )
+ {
+ // Scroll
+ for( j = 1 ; j < EF9364_NB_OF_ROWS ; j++ )
+ {
+ for( i = 0 ; i < EF9364_NB_OF_COLUMNS ; i++ )
+ {
+ m_textram->write_byte ( (j-1) * EF9364_NB_OF_COLUMNS + i , m_textram->read_byte ( j * EF9364_NB_OF_COLUMNS + i ) );
+ }
+ }
+ // Erase last line
+ for( i = 0 ; i < EF9364_NB_OF_COLUMNS ; i++ )
+ {
+ m_textram->write_byte ( ( EF9364_NB_OF_ROWS - 1 ) * EF9364_NB_OF_COLUMNS + i , 0x7F );
+ }
+
y_curs_pos = EF9364_NB_OF_ROWS - 1;
+ }
}
break;
diff --git a/src/devices/video/ef9364.h b/src/devices/video/ef9364.h
index 7456c9ad9e6..1519d817196 100644
--- a/src/devices/video/ef9364.h
+++ b/src/devices/video/ef9364.h
@@ -89,6 +89,8 @@ private:
int bitplane_xres;
int bitplane_yres;
int vsync_scanline_pos;
+ int cursor_cnt;
+ int cursor_state;
UINT32 clock_freq;
bitmap_rgb32 m_screen_out;