summaryrefslogblamecommitdiffstatshomepage
path: root/src/mess/video/apple2gs.c
blob: fb00047c30a8096ccff5d5fb870cb9a2908ef6a2 (plain) (tree)
1
2

                                            














                                                                      
                                           
 
                          
                                                               
                                                                    
 
                                              

                                   



 
                                                                                                                     
 
                          
                         

                         
                                     
                  
                        


                               
                              









                                                                      
                                                        

                                                                                
                                                                            

                         
                                              


                                                         
                                                           
                                                      
 
                                                                     
                                                        



                                                               

                                                                                            

                         
                                                   



                                                               



                                                                                                                              

                                 
                                               










                                                                   

                                                                                                   








                                                                   

                                                                                                   








                                                                                                           
                                                                    
                                              
                         
                                                        


                            
                                                         


                                                               
                                                                                  








                                                                              
                                                        

                                                                                
                                                                            



                         
                                                        



                                                                    

                                                                                            

                         




                                                                                          



                 
// license:BSD-3-Clause
// copyright-holders:Nathan Woods,R. Belmont
/*********************************************************************

    video/apple2gs.c

    Apple IIgs video code

*********************************************************************/


#include "emu.h"
#include "includes/apple2.h"
#include "includes/apple2gs.h"



VIDEO_START_MEMBER(apple2gs_state,apple2gs)
{
	m_bordercolor = 0;
	apple2_video_start(m_slowmem, m_slowmem+0x10000, 0, 8);
	m_legacy_gfx = auto_bitmap_ind16_alloc(machine(), 560, 192);

	save_item(m_bordercolor, "BORDERCLR");
	save_item(NAME(m_fgcolor));
	save_item(NAME(m_bgcolor));
}



UINT32 apple2gs_state::screen_update_apple2gs(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
	const UINT8 *vram;
	UINT32 *scanline;
	UINT8 scb, b;
	int col, palette;
	UINT32 last_pixel = 0, pixel;
	int beamy;
	UINT16 *a2pixel;

	beamy = cliprect.min_y;

	if (m_newvideo & 0x80)
	{
		// in top or bottom border?
		if ((beamy < BORDER_TOP) || (beamy >= 200+BORDER_TOP))
		{
			// don't draw past the bottom border
			if (beamy >= 231+BORDER_TOP)
			{
				return 0;
			}

			scanline = &bitmap.pix32(beamy);
			for (col = 0; col < BORDER_LEFT+BORDER_RIGHT+640; col++)
			{
				scanline[col] = m_a2_palette[m_bordercolor];
			}
		}
		else    // regular screen area
		{
			int shrline = beamy - BORDER_TOP;

			scb = m_slowmem[0x19D00 + shrline];
			palette = ((scb & 0x0f) << 4);

			vram = &m_slowmem[0x12000 + (shrline * 160)];
			scanline = &bitmap.pix32(beamy);

			// draw left and right borders
			for (col = 0; col < BORDER_LEFT; col++)
			{
				scanline[col] = m_a2_palette[m_bordercolor];
				scanline[col+BORDER_LEFT+640] = m_a2_palette[m_bordercolor];
			}

			if (scb & 0x80) // 640 mode
			{
				for (col = 0; col < 160; col++)
				{
					b = vram[col];
					scanline[col * 4 + 0 + BORDER_LEFT] = m_shr_palette[palette +  0 + ((b >> 6) & 0x03)];
					scanline[col * 4 + 1 + BORDER_LEFT] = m_shr_palette[palette +  4 + ((b >> 4) & 0x03)];
					scanline[col * 4 + 2 + BORDER_LEFT] = m_shr_palette[palette +  8 + ((b >> 2) & 0x03)];
					scanline[col * 4 + 3 + BORDER_LEFT] = m_shr_palette[palette + 12 + ((b >> 0) & 0x03)];
				}
			}
			else        // 320 mode
			{
				for (col = 0; col < 160; col++)
				{
					b = vram[col];
					pixel = (b >> 4) & 0x0f;

					if ((scb & 0x20) && !pixel)
						pixel = last_pixel;
					else
						last_pixel = pixel;
					pixel += palette;
					scanline[col * 4 + 0 + BORDER_LEFT] = m_shr_palette[pixel];
					scanline[col * 4 + 1 + BORDER_LEFT] = m_shr_palette[pixel];

					b = vram[col];
					pixel = (b >> 0) & 0x0f;

					if ((scb & 0x20) && !pixel)
						pixel = last_pixel;
					else
						last_pixel = pixel;
					pixel += palette;
					scanline[col * 4 + 2 + BORDER_LEFT] = m_shr_palette[pixel];
					scanline[col * 4 + 3 + BORDER_LEFT] = m_shr_palette[pixel];
				}
			}
		}
	}
	else
	{
		/* call legacy Apple II video rendering at scanline 0 to draw into the off-screen buffer */
		if (beamy == 0)
		{
			// check if DHR should be monochrome 560x192
			if (m_newvideo & 0x20)
			{
				m_monochrome_dhr = true;
			}
			else
			{
				m_monochrome_dhr = false;
			}

			rectangle new_cliprect(0, 559, 0, 191);
			screen_update_apple2(screen, *m_legacy_gfx, new_cliprect);
		}

		if ((beamy < (BORDER_TOP+4)) || (beamy >= (192+4+BORDER_TOP)))
		{
			if (beamy >= (231+BORDER_TOP))
			{
				return 0;
			}

			scanline = &bitmap.pix32(beamy);
			for (col = 0; col < BORDER_LEFT+BORDER_RIGHT+640; col++)
			{
				scanline[col] = m_a2_palette[m_bordercolor];
			}
		}
		else
		{
			scanline = &bitmap.pix32(beamy);

			// draw left and right borders
			for (col = 0; col < BORDER_LEFT + 40; col++)
			{
				scanline[col] = m_a2_palette[m_bordercolor];
				scanline[col+BORDER_LEFT+600] = m_a2_palette[m_bordercolor];
			}

			a2pixel = &m_legacy_gfx->pix16(beamy-(BORDER_TOP+4));
			for (int x = 0; x < 560; x++)
			{
				scanline[40 + BORDER_LEFT + x] = m_a2_palette[*a2pixel++];
			}
		}
	}
	return 0;
}