mirror of
https://github.com/holub/mame
synced 2025-06-06 04:43:45 +03:00
thomson.cpp: Initialize more state variables; clean up video code slightly
This commit is contained in:
parent
5d844e3793
commit
4026e0237c
@ -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();
|
||||
|
@ -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 );
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user