thomson.cpp: Initialize more state variables; clean up video code slightly

This commit is contained in:
AJR 2020-10-30 23:48:19 -04:00
parent 5d844e3793
commit 4026e0237c
3 changed files with 50 additions and 44 deletions

View File

@ -654,7 +654,6 @@ void thomson_state::to7_base(machine_config &config)
m_screen->set_palette("palette");
PALETTE(config, "palette", FUNC(thomson_state::thom_palette), 4097); // 12-bit color + transparency
MCFG_VIDEO_START_OVERRIDE( thomson_state, thom )
/* sound */
SPEAKER(config, "speaker").front_center();

View File

@ -203,6 +203,9 @@ public:
void overlay3_scandraw_8( uint8_t* vram, uint16_t* dst, uint16_t* pal, int org, int len );
void bitmap16alt_scandraw_8( uint8_t* vram, uint16_t* dst, uint16_t* pal, int org, int len );
protected:
virtual void video_start() override;
private:
DECLARE_FLOPPY_FORMATS(cd90_640_formats);
@ -345,7 +348,6 @@ private:
TIMER_CALLBACK_MEMBER( thom_set_init );
DECLARE_WRITE_LINE_MEMBER(thom_vblank);
DECLARE_VIDEO_START( thom );
uint8_t to7_5p14_r(offs_t offset);
void to7_5p14_w(offs_t offset, uint8_t data);
@ -519,7 +521,7 @@ private:
emu_timer* m_thom_scanline_timer; /* scan-line update */
uint16_t m_thom_last_pal[16]; /* palette at last scanline start */
uint16_t m_thom_pal[16]; /* current palette */
uint8_t m_thom_pal_changed; /* whether pal != old_pal */
bool m_thom_pal_changed; /* whether pal != old_pal */
uint8_t m_thom_border_index; /* current border color index */
/* the left and right border color for each row (including top and bottom
border rows); -1 means unchanged wrt last scanline
@ -538,11 +540,11 @@ private:
int16_t m_thom_vmodepage[41];
uint8_t m_thom_vmodepage_changed;
/* one dirty flag for each video memory line */
uint8_t m_thom_vmem_dirty[205];
bool m_thom_vmem_dirty[205];
/* set to 1 if undirty scanlines need to be redrawn due to other video state
changes */
uint8_t m_thom_vstate_dirty;
uint8_t m_thom_vstate_last_dirty;
bool m_thom_vstate_dirty;
bool m_thom_vstate_last_dirty;
uint32_t m_thom_mode_point;
uint32_t m_thom_floppy_wcount;
uint32_t m_thom_floppy_rcount;
@ -599,7 +601,7 @@ private:
void mo5nr_game_init();
void mo5nr_game_reset();
int thom_update_screen_size();
bool update_screen_size();
unsigned thom_video_elapsed();
struct thom_vsignal thom_get_vsignal();
void thom_get_lightpen_pos( int*x, int* y );

View File

@ -11,6 +11,7 @@
#include "emu.h"
#include "includes/thomson.h"
#include <algorithm>
#include <cmath>
//#define VERBOSE 1
@ -30,11 +31,11 @@
/****************** dynamic screen size *****************/
int thomson_state::thom_update_screen_size()
bool thomson_state::update_screen_size()
{
const rectangle &visarea = m_screen->visible_area();
uint8_t p = m_io_vconfig->read();
int new_w, new_h, changed = 0;
bool changed = false;
switch ( p & 3 )
{
@ -50,11 +51,11 @@ int thomson_state::thom_update_screen_size()
default: m_thom_hires = m_thom_hires_better; break; /* auto */
}
new_w = ( 320 + m_thom_bwidth * 2 ) * ( m_thom_hires + 1 ) - 1;
new_h = ( 200 + m_thom_bheight * 2 ) /** (m_thom_hires + 1 )*/ - 1;
int new_w = ( 320 + m_thom_bwidth * 2 ) * ( m_thom_hires + 1 ) - 1;
int new_h = ( 200 + m_thom_bheight * 2 ) /** (m_thom_hires + 1 )*/ - 1;
if ( ( visarea.max_x != new_w ) || ( visarea.max_y != new_h ) )
{
changed = 1;
changed = true;
m_screen->set_visible_area(0, new_w, 0, new_h );
}
@ -242,7 +243,7 @@ void thomson_state::thom_border_changed()
m_thom_border_l[ y + 1 ] = color;
m_thom_border_r[ y + 1 ] = color;
}
m_thom_vstate_dirty = 1;
m_thom_vstate_dirty = true;
}
@ -291,8 +292,8 @@ void thomson_state::thom_set_palette( unsigned index, uint16_t color )
m_thom_pal[ index ] = color;
if ( index == m_thom_border_index )
thom_border_changed();
m_thom_pal_changed = 1;
m_thom_vstate_dirty = 1;
m_thom_pal_changed = true;
m_thom_vstate_dirty = true;
}
@ -306,7 +307,7 @@ void thomson_state::thom_set_video_mode( unsigned mode )
LOG("thom_set_video_mode: %i at line %i, col %i\n", mode, thom_video_elapsed() / 64, thom_video_elapsed() % 64);
m_thom_vmode = mode;
thom_gplinfo_changed();
m_thom_vstate_dirty = 1;
m_thom_vstate_dirty = true;
m_thom_hires_better |= thom_mode_is_hires( mode );
}
}
@ -322,7 +323,7 @@ void thomson_state::thom_set_video_page( unsigned page )
LOG("thom_set_video_page: %i at line %i col %i\n", page, thom_video_elapsed() / 64, thom_video_elapsed() % 64);
m_thom_vpage = page;
thom_gplinfo_changed();
m_thom_vstate_dirty = 1;
m_thom_vstate_dirty = true;
}
}
@ -863,7 +864,7 @@ TIMER_CALLBACK_MEMBER( thomson_state::thom_scanline_start )
m_thom_last_pal, x, xx-x );
x = xx;
}
m_thom_vmem_dirty[y] = 0;
m_thom_vmem_dirty[y] = false;
}
/* prepare for next scanline */
@ -888,8 +889,8 @@ TIMER_CALLBACK_MEMBER( thomson_state::thom_scanline_start )
if ( m_thom_pal_changed )
{
memcpy( m_thom_last_pal, m_thom_pal, 32 );
m_thom_pal_changed = 0;
std::copy_n(&m_thom_pal[0], 16, &m_thom_last_pal[0]);
m_thom_pal_changed = false;
}
m_thom_scanline_timer->adjust(attotime::from_usec(64), y + 1);
@ -1088,12 +1089,12 @@ WRITE_LINE_MEMBER(thomson_state::thom_vblank)
if ( m_thom_border_r[ i ] != -1 )
b = m_thom_border_r[ i ];
}
memset( m_thom_border_l, 0xff, sizeof( m_thom_border_l ) );
memset( m_thom_border_r, 0xff, sizeof( m_thom_border_r ) );
std::fill(std::begin(m_thom_border_l), std::end(m_thom_border_l), -1);
std::fill(std::begin(m_thom_border_r), std::end(m_thom_border_r), -1);
m_thom_border_l[ 0 ] = b;
m_thom_border_r[ 0 ] = b;
m_thom_vstate_last_dirty = m_thom_vstate_dirty;
m_thom_vstate_dirty = 0;
m_thom_vstate_dirty = false;
/* schedule first init signal */
m_thom_init_timer->adjust(attotime::from_usec( 64 * THOM_BORDER_HEIGHT + 7 ));
@ -1110,8 +1111,8 @@ WRITE_LINE_MEMBER(thomson_state::thom_vblank)
m_thom_video_timer->adjust(attotime::zero);
/* update screen size according to user options */
if ( thom_update_screen_size() )
m_thom_vstate_dirty = 1;
if ( update_screen_size() )
m_thom_vstate_dirty = true;
/* hi-res automatic */
m_thom_hires_better = thom_mode_is_hires( m_thom_vmode );
@ -1155,16 +1156,16 @@ static const uint16_t mo5_pal_init[16] =
};
VIDEO_START_MEMBER( thomson_state, thom )
void thomson_state::video_start()
{
LOG("thom: video start called\n");
/* scan-line state */
memset( m_thom_border_l, 0xff, sizeof( m_thom_border_l ) );
memset( m_thom_border_r, 0xff, sizeof( m_thom_border_r ) );
memset( m_thom_vbody, 0, sizeof( m_thom_vbody ) );
memset( m_thom_vmodepage, 0xffff, sizeof( m_thom_vmodepage ) );
memset( m_thom_vmem_dirty, 0, sizeof( m_thom_vmem_dirty ) );
std::fill(std::begin(m_thom_border_l), std::end(m_thom_border_l), -1);
std::fill(std::begin(m_thom_border_r), std::end(m_thom_border_r), -1);
std::fill(std::begin(m_thom_vbody), std::end(m_thom_vbody), 0);
std::fill(std::begin(m_thom_vmodepage), std::end(m_thom_vmodepage), -1);
std::fill(std::begin(m_thom_vmem_dirty), std::end(m_thom_vmem_dirty), false);
m_thom_border_l[ 0 ] = 0;
m_thom_border_r[ 0 ] = 0;
m_thom_vmodepage[ 0 ] = 0;
@ -1172,8 +1173,8 @@ VIDEO_START_MEMBER( thomson_state, thom )
m_thom_vmode = 0;
m_thom_vpage = 0;
m_thom_border_index = 0;
m_thom_vstate_dirty = 1;
m_thom_vstate_last_dirty = 1;
m_thom_vstate_dirty = true;
m_thom_vstate_last_dirty = true;
save_pointer(NAME(m_thom_last_pal), sizeof(m_thom_last_pal));
save_pointer(NAME(m_thom_pal), sizeof(m_thom_pal));
save_pointer(NAME(m_thom_border_l), sizeof(m_thom_border_l));
@ -1213,6 +1214,10 @@ VIDEO_START_MEMBER( thomson_state, thom )
m_thom_init_cb = nullptr;
m_thom_init_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(thomson_state::thom_set_init),this));
m_thom_bwidth = 0;
m_thom_bheight = 0;
m_thom_hires = 0;
m_thom_hires_better = 0;
save_item(NAME(m_thom_bwidth));
save_item(NAME(m_thom_bheight));
save_item(NAME(m_thom_hires));
@ -1223,8 +1228,8 @@ VIDEO_START_MEMBER( thomson_state, thom )
/* sets the fixed palette (for MO5,TO7,TO7/70) and gamma correction */
void thomson_state::thom_configure_palette(double gamma, const uint16_t* pal, palette_device& palette)
{
memcpy(m_thom_last_pal, pal, 32);
memcpy(m_thom_pal, pal, 32);
std::copy_n(&pal[0], 16, &m_thom_last_pal[0]);
std::copy_n(&pal[0], 16, &m_thom_pal[0]);
for ( int i = 0; i < 4097; i++ )
{
@ -1281,7 +1286,7 @@ void thomson_state::to7_vram_w(offs_t offset, uint8_t data)
return;
m_thom_vram[ offset + m_thom_mode_point ] = data;
/* dirty whole scanline */
m_thom_vmem_dirty[ offset / 40 ] = 1;
m_thom_vmem_dirty[ offset / 40 ] = true;
}
@ -1317,7 +1322,7 @@ void thomson_state::to770_vram_w(offs_t offset, uint8_t data)
return;
m_thom_vram[ offset + m_thom_mode_point ] = data;
/* dirty whole scanline */
m_thom_vmem_dirty[ offset / 40 ] = 1;
m_thom_vmem_dirty[ offset / 40 ] = true;
}
@ -1337,7 +1342,7 @@ void thomson_state::to8_sys_lo_w(offs_t offset, uint8_t data)
return;
*dst = data;
/* dirty whole scanline */
m_thom_vmem_dirty[ offset / 40 ] = 1;
m_thom_vmem_dirty[ offset / 40 ] = true;
}
@ -1349,7 +1354,7 @@ void thomson_state::to8_sys_hi_w(offs_t offset, uint8_t data)
if ( *dst == data ) return;
*dst = data;
/* dirty whole scanline */
m_thom_vmem_dirty[ offset / 40 ] = 1;
m_thom_vmem_dirty[ offset / 40 ] = true;
}
@ -1366,7 +1371,7 @@ void thomson_state::to8_data_lo_w(offs_t offset, uint8_t data)
/* dirty whole scanline */
if ( m_to8_data_vpage >= 4 )
return;
m_thom_vmem_dirty[ offset / 40 ] = 1;
m_thom_vmem_dirty[ offset / 40 ] = true;
}
@ -1381,7 +1386,7 @@ void thomson_state::to8_data_hi_w(offs_t offset, uint8_t data)
/* dirty whole scanline */
if ( m_to8_data_vpage >= 4 )
return;
m_thom_vmem_dirty[ offset / 40 ] = 1;
m_thom_vmem_dirty[ offset / 40 ] = true;
}
@ -1397,7 +1402,7 @@ void thomson_state::to8_vcart_w(offs_t offset, uint8_t data)
/* dirty whole scanline */
if ( m_to8_cart_vpage >= 4 )
return;
m_thom_vmem_dirty[ (offset & 0x1fff) / 40 ] = 1;
m_thom_vmem_dirty[ (offset & 0x1fff) / 40 ] = true;
}
void thomson_state::mo6_vcart_lo_w(offs_t offset, uint8_t data)
@ -1410,7 +1415,7 @@ void thomson_state::mo6_vcart_lo_w(offs_t offset, uint8_t data)
/* dirty whole scanline */
if ( m_to8_cart_vpage >= 4 )
return;
m_thom_vmem_dirty[ (offset & 0x1fff) / 40 ] = 1;
m_thom_vmem_dirty[ (offset & 0x1fff) / 40 ] = true;
}
void thomson_state::mo6_vcart_hi_w(offs_t offset, uint8_t data)
@ -1423,5 +1428,5 @@ void thomson_state::mo6_vcart_hi_w(offs_t offset, uint8_t data)
/* dirty whole scanline */
if ( m_to8_cart_vpage >= 4 )
return;
m_thom_vmem_dirty[ (offset & 0x1fff) / 40 ] = 1;
m_thom_vmem_dirty[ (offset & 0x1fff) / 40 ] = true;
}