Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Minor VIC fixes #16

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
220 changes: 145 additions & 75 deletions src/vic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ bool Vic::emulate()
{
case kCharMode:
case kMCCharMode:
case kExtBgMode:
draw_raster_char_mode();
break;
case kBitmapMode:
Expand Down Expand Up @@ -128,6 +129,7 @@ uint8_t Vic::read_register(uint8_t r)
case 0x4:
case 0x6:
case 0x8:
case 0xa:
case 0xc:
case 0xe:
retval = mx_[r >> 1];
Expand Down Expand Up @@ -260,6 +262,7 @@ void Vic::write_register(uint8_t r, uint8_t v)
case 0x4:
case 0x6:
case 0x8:
case 0xa:
case 0xc:
case 0xe:
mx_[r >> 1] = v;
Expand Down Expand Up @@ -432,6 +435,14 @@ uint8_t Vic::get_char_color(int column, int row)
*/
uint8_t Vic::get_char_data(int chr, int line)
{

if(graphic_mode_ == kExtBgMode)
{
if(chr >= 64 && chr <= 127) chr = chr - 64;
else if(chr >= 128 && chr <= 191) chr = chr - 128;
else if(chr >= 192 && chr <= 255) chr = chr - 192;
}

uint16_t addr = char_mem_ + (chr * 8) + line;
return mem_->vic_read_byte(addr);
}
Expand Down Expand Up @@ -477,6 +488,32 @@ void Vic::draw_char(int x, int y, uint8_t data, uint8_t color)
}
}

void Vic::draw_ext_backcolor_char(int x, int y, uint8_t data, uint8_t color, uint8_t c)
{
for(int i=0 ; i < 8 ; i++)
{
int xoffs = x + 8 - i + horizontal_scroll();
/* don't draw outside (due to horizontal scroll) */
if(xoffs > kGFirstCol + kGResX)
continue;

/* draw pixel */
if(ISSET_BIT(data,i))
{
io_->screen_update_pixel(xoffs,y,color);
}
else
{
if(c >=64 && c <= 127)
io_->screen_update_pixel(xoffs,y,bgcolor_[1]);
if(c >=128 && c <= 191)
io_->screen_update_pixel(xoffs,y,bgcolor_[2]);
if(c >=192 && c <= 255)
io_->screen_update_pixel(xoffs,y,bgcolor_[3]);
}
}
}

void Vic::draw_mcchar(int x, int y, uint8_t data, uint8_t color)
{
for(int i=0 ; i < 4 ; i++)
Expand Down Expand Up @@ -516,21 +553,23 @@ void Vic::draw_raster_char_mode()
{
int rstr = raster_counter();
int y = rstr - kFirstVisibleLine;
if((rstr >= kGFirstLine) &&
(rstr < kGLastLine) &&
!is_screen_off())
if((rstr >= kGFirstLine) && (rstr < kGLastLine) && !is_screen_off())
{
/* draw background */
io_->screen_draw_rect(kGFirstCol,y,kGResX,bgcolor_[0]);
if(!ISSET_BIT(cr2_,3)) // 38 columns
io_->screen_draw_rect(kGFirstCol+8,y,kGResX-16,bgcolor_[0]);
else
io_->screen_draw_rect(kGFirstCol,y,kGResX,bgcolor_[0]);

/* draw characters */
for(int column=0; column < kGCols ; column++)
{
/* check 38 cols mode */
if(!ISSET_BIT(cr2_,3))
if(!ISSET_BIT(cr2_,3)) // 38 columns
{
if (column == 0) continue;
if (column == kGCols -1 ) continue;
if(column == 0) continue;
if(column == kGCols-1) continue;
}

int x = kGFirstCol + column * 8;
int line = rstr - kGFirstLine;
int row = line/8;
Expand All @@ -544,8 +583,10 @@ void Vic::draw_raster_char_mode()
/* draw character */
if(graphic_mode_ == kMCCharMode && ISSET_BIT(color,3))
draw_mcchar(x,y,data,(color&0x7));
else
draw_char(x,y,data,color);
else if(graphic_mode_ == kCharMode)
draw_char(x,y,data,color);
else if(graphic_mode_ == kExtBgMode)
draw_ext_backcolor_char(x,y,data,color,c);
}
}
}
Expand Down Expand Up @@ -646,86 +687,115 @@ void Vic::draw_raster_bitmap_mode()

void Vic::draw_mcsprite(int x, int y, int sprite, int row)
{
uint8_t swid = is_double_width_sprite(sprite) == true ? 2 : 1;
uint16_t addr = get_sprite_ptr(sprite);
for (int i=0; i < 3 ; i++)

uint8_t side_border_offset = 0;
uint8_t top_border_offset=0;
uint8_t btm_border_offset=0;

// 38 col mode
if(!ISSET_BIT(cr2_,3))
side_border_offset = 8;

// 24 line mode
if(!ISSET_BIT(cr1_,3))
{
uint8_t data = mem_->vic_read_byte(addr + row * 3 + i);
for (int j=0; j < 4; j++)
top_border_offset=2;
btm_border_offset=4;
}
uint16_t minX = kGFirstCol+side_border_offset;
uint16_t maxX = kGResX+kGFirstCol-side_border_offset;
uint16_t minY = kGFirstCol + top_border_offset;
uint16_t maxY = kGResY+kGFirstCol - btm_border_offset;

for(int w=0;w<swid;w++)
{
for (int i=0; i < 3 ; i++)
{
/* color */
uint8_t c = 0;
/* color source */
uint8_t cs = ((data >> j*2) & 0x3);
switch(cs)
{
/* transparent */
case 0:
break;
case 1:
c = sprite_shared_colors_[0];
break;
case 2:
c = sprite_colors_[sprite];
break;
case 3:
c = sprite_shared_colors_[1];
break;
}
/* draw if not transparent */
if(cs != 0)
uint8_t data = mem_->vic_read_byte(addr + row * 3 + i);
for (int j=0; j < 4; j++)
{
io_->screen_update_pixel(
x + i*8 + 8 - j * 2,
y,
c);
io_->screen_update_pixel(
x + i*8 + 8 - j * 2 + 1,
y,
c);
/* color */
uint8_t c = 0;
/* color source */
uint8_t cs = ((data >> j*2) & 0x3);
switch(cs)
{
/* transparent */
case 0:
break;
case 1:
c = sprite_shared_colors_[0];
break;
case 2:
c = sprite_colors_[sprite];
break;
case 3:
c = sprite_shared_colors_[1];
break;
}
/* draw if not transparent */
if(cs != 0)
{
uint16_t newX = (x+w+(i*8*swid) + (8*swid) - (j*swid*2));

if(newX > minX && y >= minY && newX <= maxX && y < maxY)
io_->screen_update_pixel(newX,y,c);

newX++;
if(newX > minX && y >= minY && newX <= maxX && y < maxY)
io_->screen_update_pixel(newX,y,c);

newX++;
if(is_double_width_sprite(sprite) && newX > minX && y >= minY && newX <= maxX && y < maxY)
io_->screen_update_pixel(newX,y,c);
}
}
}
}
}

void Vic::draw_sprite(int x, int y, int sprite, int row)
{
int swid = is_double_width_sprite(sprite) ? 2 : 1;
uint8_t swid = is_double_width_sprite(sprite) == true ? 2 : 1;
uint16_t addr = get_sprite_ptr(sprite);
for(int w=0; w < swid ; w++ )

uint8_t side_border_offset = 0;
uint8_t top_border_offset=0;
uint8_t btm_border_offset=0;

uint16_t minX = kGFirstCol+side_border_offset;
uint16_t maxX = kGResX+kGFirstCol-side_border_offset;
uint16_t minY = kGFirstCol + top_border_offset;
uint16_t maxY = kGResY+kGFirstCol - btm_border_offset;

// 38 col mode
if(!ISSET_BIT(cr2_,3))
side_border_offset = 8;

// 24 line mode
if(!ISSET_BIT(cr1_,3))
{
top_border_offset=2;
btm_border_offset=4;
}

for(int w=0;w<swid;w++)
{
for (int i=0; i < 3 ; i++)
{
uint8_t data = mem_->vic_read_byte(addr + row * 3 + i);
{
uint8_t data = mem_->vic_read_byte(addr + row * 3 + i);

for (int j=0; j < 8; j++)
{
if(ISSET_BIT(data,j))
{
int new_x = (x+w + (i*8*swid) + (8*swid) - (j*swid)) ;
int color = sprite_colors_[sprite];
int side_border_offset = 0;
int top_border_offset = 0;
int btm_border_offset = 0;
/* check 38 cols mode */
if(!ISSET_BIT(cr2_,3))
side_border_offset = 8;
/* check 24 line mode */
if(!ISSET_BIT(cr1_,3))
{
top_border_offset = 2;
btm_border_offset = 4;
}
/* check bounds */
if(new_x <= kGFirstCol+side_border_offset ||
y < kGFirstCol + top_border_offset ||
new_x > kGResX+kGFirstCol-side_border_offset ||
y >= kGResY+kGFirstCol - btm_border_offset)
color = border_color_;
/* update pixel */
io_->screen_update_pixel(
new_x,
y,
color);
}
{
if(ISSET_BIT(data,j))
{
uint16_t newX = (x+w + (i*8*swid) + (8*swid) - (j*swid)) ;

if(newX > minX && y >= minY && newX <= maxX && y < maxY)
io_->screen_update_pixel(newX,y,sprite_colors_[sprite]);
}
}
}
}
Expand Down
1 change: 1 addition & 0 deletions src/vic.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ class Vic
/* graphics */
inline void draw_raster_char_mode();
inline void draw_raster_bitmap_mode();
inline void draw_ext_backcolor_char(int x, int y, uint8_t data, uint8_t color, uint8_t c);
inline void draw_raster_sprites();
inline void draw_sprite(int x, int y, int sprite, int row);
inline void draw_mcsprite(int x, int y, int sprite, int row);
Expand Down