Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

349 lines
6.6 KiB

#include "insignia.h"
#include "host_def.h"
/*
* SoftPC Revision 3.0
*
* Title : ga_glue.c
*
* Description : Glue to fit an a2cpu to 3.0 GA graphics
* Also used for later C CPUs which use the 2.0
* video interface.
*
* Author : John Shanly
*
* Notes :
*
*/
/*
* static char SccsID[] = "@(#)ga_glue.c 1.14 12/17/93 Copyright Insignia Solutions Ltd.";
*/
#ifdef C_VID
#include "xt.h"
#include CpuH
#include "sas.h"
#include "gvi.h"
#include "gmi.h"
#include "egacpu.h"
#include "cpu_vid.h"
#include "ga_defs.h"
#include <stdio.h>
#include "trace.h"
#include "debug.h"
#define INTEL_SRC 0
#define HOST_SRC 1
IMPORT READ_POINTERS C_vid_reads;
IMPORT WRT_POINTERS C_vid_writes;
GLOBAL VOID
glue_b_write( addr, val )
UTINY *addr;
ULONG val;
{
sub_note_trace2( GLUE_VERBOSE,
"glue_b_write: addr=%x, pe = %x", addr, VGLOBS->plane_enable );
#ifdef CCPU
EasVal = val;
Ead = (ULONG) addr - gvi_pc_low_regen;
#else
UNUSED(val);
EasVal = *addr;
Ead = (ULONG) addr - (ULONG) get_byte_addr(gvi_pc_low_regen);
#endif /* CCPU */
(*C_vid_writes.b_write)( EasVal, Ead );
}
GLOBAL VOID
glue_w_write( addr, val )
UTINY *addr;
ULONG val;
{
sub_note_trace2( GLUE_VERBOSE,
"glue_w_write: addr=%x, pe = %x", addr, VGLOBS->plane_enable );
#ifdef CCPU
EasVal = val;
Ead = (ULONG) addr - gvi_pc_low_regen;
#else
UNUSED(val);
EasVal = *addr | ( *(addr+1) << 8 );
Ead = (ULONG) addr - (ULONG) get_byte_addr(gvi_pc_low_regen);
#endif /* CCPU */
(*C_vid_writes.w_write)( EasVal, Ead );
}
#ifndef NO_STRING_OPERATIONS
GLOBAL VOID
glue_b_fill( laddr, haddr, val )
UTINY *laddr, *haddr;
ULONG val;
{
sub_note_trace3( GLUE_VERBOSE,
"glue_b_fill: laddr=%x, haddr=%x, pe = %x", laddr, haddr, VGLOBS->plane_enable );
Count = haddr - laddr + 1;
#ifdef CCPU
Ead = (ULONG) laddr - gvi_pc_low_regen;
EasVal = val;
#else
UNUSED(val);
Ead = (ULONG) laddr - (ULONG) get_byte_addr(gvi_pc_low_regen);
EasVal = *laddr;
#endif /* CCPU */
(*C_vid_writes.b_fill)( EasVal, Ead, Count );
}
GLOBAL VOID
glue_w_fill( laddr, haddr, val )
UTINY *laddr, *haddr;
ULONG val;
{
sub_note_trace3( GLUE_VERBOSE,
"glue_w_fill: laddr=%x, haddr=%x, pe = %x", laddr, haddr, VGLOBS->plane_enable );
Count = haddr - laddr + 1;
#ifdef CCPU
Ead = (ULONG) laddr - gvi_pc_low_regen;
EasVal = val;
#else
UNUSED(val);
Ead = (ULONG) laddr - (ULONG) get_byte_addr(gvi_pc_low_regen);
EasVal = *laddr | ( *(laddr+1) << 8 );
#endif /* CCPU */
(*C_vid_writes.w_fill)( EasVal, Ead, Count );
}
GLOBAL VOID
glue_b_move( laddr, haddr, src, src_type )
UTINY *laddr, *haddr, *src, src_type;
{
sub_note_trace3( GLUE_VERBOSE,
"glue_b_move: laddr=%x, haddr=%x, pe = %x", laddr, haddr, VGLOBS->plane_enable );
Count = haddr - laddr + 1;
#ifdef CCPU
Ead = (ULONG) laddr - gvi_pc_low_regen;
EasVal = (ULONG) src;
#else
UNUSED(src);
UNUSED(src_type);
Ead = (ULONG) laddr - (ULONG) get_byte_addr(gvi_pc_low_regen);
EasVal = (ULONG) haddr_of_src_string - Count + 1;
#endif /* CCPU */
#ifdef CCPU
if(( src_type == HOST_SRC )
|| ( EasVal < (ULONG) gvi_pc_low_regen ) || ((ULONG) gvi_pc_high_regen < EasVal ))
#else
if(( EasVal < (ULONG) get_byte_addr(gvi_pc_low_regen) ) || ((ULONG) get_byte_addr(gvi_pc_high_regen) < EasVal ))
#endif /* CCPU */
{
/* Ram source */
V1 = 0;
#ifdef CCPU
/*
* This looks like a deliberate hack to pass an intel address
* in a host pointer. Hence I've added a cast to the
* get_byte_addr call to remove an ANSI warning. (Mike).
*/
if( src_type == INTEL_SRC )
EasVal = (ULONG) get_byte_addr((PHY_ADDR)src); /* Staging post eliminated */
#else
EasVal = (ULONG) laddr; /* Staging post hack */
#endif /* CCPU */
}
else
{
/* VGA source */
V1 = 1;
#ifdef CCPU
EasVal -= (ULONG) gvi_pc_low_regen;
#else
EasVal -= (ULONG) get_byte_addr(gvi_pc_low_regen);
#endif /* CCPU */
}
if( getDF() )
{
Ead += Count - 1;
EasVal += Count - 1;
(*C_vid_writes.b_bwd_move)( Ead, EasVal, Count, V1 );
}
else
(*C_vid_writes.b_fwd_move)( Ead, EasVal, Count, V1 );
}
GLOBAL VOID
glue_w_move( laddr, haddr, src )
UTINY *laddr, *haddr, *src;
{
sub_note_trace3( GLUE_VERBOSE,
"glue_w_move: laddr=%x, haddr=%x, pe = %x", laddr, haddr, VGLOBS->plane_enable );
Count = ( haddr - laddr + 1 ) >> 1;
#ifdef CCPU
Ead = (ULONG) laddr;
EasVal = (ULONG) src;
#else
UNUSED(src);
Ead = (ULONG) laddr - (ULONG) get_byte_addr(gvi_pc_low_regen);
EasVal = (ULONG) haddr_of_src_string - ( Count << 1 ) + 1;
#endif /* CCPU */
#ifdef CCPU
if(( EasVal < (ULONG) gvi_pc_low_regen ) || ((ULONG) gvi_pc_high_regen < EasVal ))
#else
if(( EasVal < (ULONG) get_byte_addr(gvi_pc_low_regen) ) || ((ULONG) get_byte_addr(gvi_pc_high_regen) < EasVal ))
#endif /* CCPU */
{
/* Ram source */
V1 = 0;
#ifdef CCPU
EasVal = (ULONG ) get_byte_addr((PHY_ADDR)laddr); /* Staging post hack */
#else
EasVal = (ULONG) laddr; /* Staging post hack */
#endif /* CCPU */
}
else
{
/* VGA source */
V1 = 1;
#ifdef CCPU
EasVal -= (ULONG) gvi_pc_low_regen;
#else
EasVal -= (ULONG) get_byte_addr(gvi_pc_low_regen);
#endif /* CCPU */
}
if( getDF() )
{
Ead += ( Count << 1 ) - 2;
EasVal += ( Count << 1 ) - 2;
(*C_vid_writes.w_bwd_move)( Ead, EasVal, Count, V1 );
}
else
(*C_vid_writes.w_fwd_move)( Ead, EasVal, Count, V1 );
}
#endif /* NO_STRING_OPERATIONS */
/**/
GLOBAL ULONG
glue_b_read( addr )
UTINY *addr;
{
sub_note_trace2( GLUE_VERBOSE,
"glue_b_read: addr=%x, shift = %d", addr, VGLOBS->read_shift_count );
#ifdef CCPU
EasVal = (ULONG) addr - (ULONG) gvi_pc_low_regen;
#else
EasVal = (ULONG) addr - (ULONG) get_byte_addr(gvi_pc_low_regen);
#endif /* CCPU */
(*C_vid_reads.b_read)( EasVal );
#ifdef CCPU
return( EasVal );
#else
*addr = EasVal;
return( 0 );
#endif /* CCPU */
}
GLOBAL ULONG
glue_w_read( addr )
UTINY *addr;
{
sub_note_trace2( GLUE_VERBOSE,
"glue_w_read: addr=%x, shift = %d", addr, VGLOBS->read_shift_count );
#ifdef CCPU
EasVal = (ULONG) addr - (ULONG) gvi_pc_low_regen;
#else
EasVal = (ULONG) addr - (ULONG) get_byte_addr(gvi_pc_low_regen);
#endif /* CCPU */
(*C_vid_reads.w_read)( EasVal );
#ifdef CCPU
return( EasVal );
#else
*(addr+1) = EasVal >> 8;
*addr = EasVal;
return( 0 );
#endif /* CCPU */
}
GLOBAL VOID
glue_str_read( laddr, haddr )
UTINY *laddr, *haddr;
{
sub_note_trace3( GLUE_VERBOSE,
"glue_str_read: laddr=%x, haddr=%x, shift = %d",
laddr, haddr, VGLOBS->read_shift_count );
Count = haddr - laddr + 1;
#ifdef CCPU
EasVal = (ULONG) laddr - (ULONG) gvi_pc_low_regen;
#else
EasVal = (ULONG) laddr - (ULONG) get_byte_addr(gvi_pc_low_regen);
#endif /* CCPU */
Ead = (ULONG ) laddr;
(*C_vid_reads.str_read)( (UTINY *)Ead, EasVal, Count );
}
#endif /* C_VID */