summaryrefslogblamecommitdiffstatshomepage
path: root/src/mame/video/aussiebyte.cpp
blob: da24476a701a25e9dadf44052148c829f8517c73 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14













                                                             
                
































                                                                                                         
                             
         
                                                                   





















                                                                                
                                         



                                            
                                








                                                                           
                                     
                 
                                                                           










                                                                          
                                 
                                        








                                                               
                                                                                                                
 
                        

























                                                                                                     
                                                                  






                                                                        
 





                                                                              
                                     
                        
                                                 
                            
                                             






                                                                      


                                       






                                                  
                                 
















                                                                   
// license:BSD-3-Clause
// copyright-holders:Robbbert
/***********************************************************

    Video
    Graphics not working properly.
    Mode 0 - lores (wide, chunky)
    Mode 1 - external, *should* be ok
    Mode 2 - thin graphics, not explained well enough to code
    Mode 3 - alphanumeric, works



************************************************************/
#include "emu.h"
#include "includes/aussiebyte.h"
/***********************************************************

    I/O Ports

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

// dummy read port, forces requested action to happen
READ8_MEMBER( aussiebyte_state::port33_r )
{
	return 0xff;
}

/*
Video control - needs to be fully understood
d0, d1, d2, d3 - can replace RA0-3 in graphics mode
d4 - GS - unknown
d5 - /SRRD - controls write of data to either vram or aram (1=vram, 0=aram)
d6 - /VWR - 0 = enable write vdata to vram, read from aram to vdata ; 1 = enable write to aram from vdata
d7 - OE on port 35
*/
WRITE8_MEMBER( aussiebyte_state::port34_w )
{
	m_port34 = data;
}

WRITE8_MEMBER( aussiebyte_state::port35_w )
{
	m_port35 = data;
}

READ8_MEMBER( aussiebyte_state::port36_r )
{
	if (BIT(m_port34, 5))
	{
		if (BIT(m_p_attribram[m_alpha_address & 0x7ff], 7))
			return m_p_videoram[m_alpha_address];
		else
			return m_p_videoram[m_graph_address];
	}
	else
		return m_p_attribram[m_alpha_address & 0x7ff];
}

READ8_MEMBER( aussiebyte_state::port37_r )
{
	return m_crtc->de_r() ? 0xff : 0xfe;
}


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

    Video

************************************************************/
MC6845_ON_UPDATE_ADDR_CHANGED( aussiebyte_state::crtc_update_addr )
{
/* not sure what goes in here - parameters passed are device, address, strobe */
//  m_video_address = address;// & 0x7ff;
}

WRITE8_MEMBER( aussiebyte_state::address_w )
{
	m_crtc->address_w(data);

	m_video_index = data & 0x1f;

	if (m_video_index == 31)
	{
		m_alpha_address++;
		m_alpha_address &= 0x3fff;
		m_graph_address = (m_alpha_address << 4) | (m_port34 & 15);

		if (BIT(m_port34, 5))
		{
			if (BIT(m_p_attribram[m_alpha_address & 0x7ff], 7))
				m_p_videoram[m_alpha_address] = m_port35;
			else
				m_p_videoram[m_graph_address] = m_port35;
		}
		else
			m_p_attribram[m_alpha_address & 0x7ff] = m_port35;
	}
}

WRITE8_MEMBER( aussiebyte_state::register_w )
{
	m_crtc->register_w(data);
	uint16_t temp = m_alpha_address;

	// Get transparent address
	if (m_video_index == 18)
		m_alpha_address = (data << 8 ) | (temp & 0xff);
	else
	if (m_video_index == 19)
		m_alpha_address = data | (temp & 0xff00);
}

uint8_t aussiebyte_state::crt8002(uint8_t ac_ra, uint8_t ac_chr, uint8_t ac_attr, uint16_t ac_cnt, bool ac_curs)
{
	uint8_t gfx = 0;
	switch (ac_attr & 3)
	{
		case 0: // lores gfx
			switch (ac_ra)
			{
				case 0:
				case 1:
				case 2:
					gfx = (BIT(ac_chr, 7) ? 0xf8 : 0) | (BIT(ac_chr, 3) ? 7 : 0);
					break;
				case 3:
				case 4:
				case 5:
					gfx = (BIT(ac_chr, 6) ? 0xf8 : 0) | (BIT(ac_chr, 2) ? 7 : 0);
					break;
				case 6:
				case 7:
				case 8:
					gfx = (BIT(ac_chr, 5) ? 0xf8 : 0) | (BIT(ac_chr, 1) ? 7 : 0);
					break;
				default:
					gfx = (BIT(ac_chr, 4) ? 0xf8 : 0) | (BIT(ac_chr, 0) ? 7 : 0);
					break;
			}
			break;
		case 1: // external mode
			gfx = bitswap<8>(ac_chr, 0,1,2,3,4,5,6,7);
			break;
		case 2: // thin gfx
			break;
		case 3: // alpha
			gfx = m_p_chargen[((ac_chr & 0x7f)<<4) | ac_ra];
			break;
	}

	if (BIT(ac_attr, 3) & (ac_ra == 11)) // underline
		gfx = 0xff;
	if (BIT(ac_attr, 2) & ((ac_ra == 5) | (ac_ra == 6))) // strike-through
		gfx = 0xff;
	if (BIT(ac_attr, 6) & BIT(ac_cnt, 13)) // flash
		gfx = 0;
	if (BIT(ac_attr, 5)) // blank
		gfx = 0;
	if (ac_curs && BIT(ac_cnt, 14)) // cursor
		gfx ^= 0xff;
	if (BIT(ac_attr, 4)) // reverse video
		gfx ^= 0xff;
	return gfx;
}

MC6845_UPDATE_ROW( aussiebyte_state::crtc_update_row )
{
	const rgb_t *palette = m_palette->palette()->entry_list_raw();
	uint8_t chr,gfx,attr;
	uint16_t mem,x;
	uint32_t *p = &bitmap.pix32(y);
	ra &= 15;
	m_cnt++;

	for (x = 0; x < x_count; x++)
	{
		mem = ma + x;
		attr = m_p_attribram[mem & 0x7ff];
		if (BIT(attr, 7))
			chr = m_p_videoram[mem & 0x3fff]; // alpha
		else
			chr = m_p_videoram[(mem << 4) | ra]; // gfx

		gfx = crt8002(ra, chr, attr, m_cnt, (x==cursor_x));

		/* Display a scanline of a character (8 pixels) */
		*p++ = palette[BIT(gfx, 7)];
		*p++ = palette[BIT(gfx, 6)];
		*p++ = palette[BIT(gfx, 5)];
		*p++ = palette[BIT(gfx, 4)];
		*p++ = palette[BIT(gfx, 3)];
		*p++ = palette[BIT(gfx, 2)];
		*p++ = palette[BIT(gfx, 1)];
		*p++ = palette[BIT(gfx, 0)];
	}
}