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.
 
 
 
 
 
 

468 lines
16 KiB

/*
* SccsID = @(#)egacpu.h 1.22 10/24/94 Copyright Insignia Solutions Ltd.
*/
typedef enum
{
WRITE_MODE,
PLANES_ENABLED,
ROTATION,
CHAINED,
BIT_PROT,
FUNCTION,
SET_RESET,
ENABLE_SET_RESET,
RAM_ENABLED,
RAM_MOVED
} CHANGE_TYPE;
typedef union
{
#ifdef BIT_ORDER1
struct
{
unsigned unused:27;
unsigned sr:1;
unsigned bp:1;
unsigned func:2;
unsigned pe:1;
} state;
struct
{
unsigned unused:27;
unsigned lookup:5;
} mode_0;
struct
{
unsigned unused:31;
unsigned lookup:1;
} mode_1;
struct
{
unsigned unused:28;
unsigned lookup:4;
} mode_2;
struct
{
unsigned unused:28;
unsigned lookup:4;
} mode_3;
#else
struct
{
unsigned pe:1;
unsigned func:2;
unsigned bp:1;
unsigned sr:1;
unsigned unused:27;
} state;
struct
{
unsigned lookup:5;
unsigned unused:27;
} mode_0;
struct
{
unsigned lookup:1;
unsigned unused:31;
} mode_1;
struct
{
unsigned lookup:4;
unsigned unused:28;
} mode_2;
struct
{
unsigned lookup:4;
unsigned unused:28;
} mode_3;
#endif
} MAGIC;
typedef struct
{
ULONG latches;
UTINY *VGA_rplane;
UTINY *VGA_wplane;
UTINY *scratch;
ULONG sr_masked_val;
ULONG sr_nmask;
ULONG data_and_mask;
ULONG data_xor_mask;
ULONG latch_xor_mask;
ULONG bit_prot_mask;
ULONG plane_enable;
ULONG plane_enable_mask;
ULONG *sr_lookup;
VOID (*fwd_str_read_addr)();
VOID (*bwd_str_read_addr)();
ULONG dirty_flag;
LONG dirty_low;
LONG dirty_high;
IU8 *video_copy;
VOID (*mark_byte)();
VOID (*mark_word)();
VOID (*mark_string)();
ULONG read_shift_count;
ULONG read_mapped_plane;
ULONG colour_comp;
ULONG dont_care;
ULONG v7_vid_copy_off;
ULONG copy_func_pbp;
UTINY *route_reg1;
UTINY *route_reg2;
UTINY *screen_ptr;
ULONG rotate;
} VGA_GLOBALS;
extern struct EGA_CPU_GLOBALS
{
#ifndef HOST_VGA_GLOBALS
VGA_GLOBALS *globals;
#endif
ULONG saved_state; /* Last value of EGA_CPU.ega_state.state */
ULONG saved_mode_chain; /* Last value of mode/chain combined */
MAGIC ega_state;
ULONG fun_or_protection; /* true means write function is 1-3 and/or there
is bit protection, so latches must be used */
ULONG calc_data_xor; /* Used to recalculate data_xor_mask when the
bit prot reg changes */
ULONG calc_latch_xor; /* Used to recalculate latch_xor_mask when the
bit prot reg changes */
ULONG set_reset;
ULONG sr_enable;
ULONG sr_value;
ULONG ram_enabled;
UTINY write_mode;
UTINY chain;
UTINY doubleword;
UTINY *plane_offset;
UTINY *read_mapped_plane_ch2;
#ifdef V7VGA
UTINY seq_chain4;
UTINY seq_chain;
#endif
} EGA_CPU;
#ifndef CPU_40_STYLE /* Vglobs done via access fns */
#ifdef HOST_VGA_GLOBALS
/* Some hosts, such as the Mac, declare their own VGA_GLOBALS structure */
IMPORT VGA_GLOBALS HostVGAGlobals;
#define VGLOBS (&HostVGAGlobals) /*Always used as a pointer*/
#else
#define VGLOBS EGA_CPU.globals
#endif
#define getVideolatches() VGLOBS->latches
#define setVideolatches(value) VGLOBS->latches = value
#define getVideorplane() VGLOBS->VGA_rplane
#define setVideorplane(value) VGLOBS->VGA_rplane = value
#define getVideowplane() VGLOBS->VGA_wplane
#define setVideowplane(value) VGLOBS->VGA_wplane = value
#define getVideoscratch() VGLOBS->scratch
#define setVideoscratch(value) VGLOBS->scratch = value
#define getVideosr_masked_val() VGLOBS->sr_masked_val
#define setVideosr_masked_val(value) VGLOBS->sr_masked_val = value
#define getVideosr_nmask() VGLOBS->sr_nmask
#define setVideosr_nmask(value) VGLOBS->sr_nmask = value
#define getVideodata_and_mask() VGLOBS->data_and_mask
#define setVideodata_and_mask(value) VGLOBS->data_and_mask = value
#define getVideodata_xor_mask() VGLOBS->data_xor_mask
#define setVideodata_xor_mask(value) VGLOBS->data_xor_mask = value
#define getVideolatch_xor_mask() VGLOBS->latch_xor_mask
#define setVideolatch_xor_mask(value) VGLOBS->latch_xor_mask = value
#define getVideobit_prot_mask() VGLOBS->bit_prot_mask
#define setVideobit_prot_mask(value) VGLOBS->bit_prot_mask = value
#define getVideoplane_enable() VGLOBS->plane_enable
#define setVideoplane_enable(value) VGLOBS->plane_enable = value
#define getVideoplane_enableMask() VGLOBS->plane_enable_mask
#define setVideoplane_enable_mask(value) VGLOBS->plane_enable_mask = value
#define getVideosr_lookup() VGLOBS->sr_lookup
#define setVideosr_lookup(value) VGLOBS->sr_lookup = value
#define getVideofwd_str_read_addr() VGLOBS->fwd_str_read_addr
#define setVideofwd_str_read_addr(value) VGLOBS->fwd_str_read_addr = value
#define getVideobwd_str_read_addr() VGLOBS->bwd_str_read_addr
#define setVideobwd_str_read_addr(value) VGLOBS->bwd_str_read_addr = value
#define getVideodirty_total() VGLOBS->dirty_flag
#define setVideodirty_total(value) VGLOBS->dirty_flag = value
#define getVideodirty_low() VGLOBS->dirty_low
#define setVideodirty_low(value) VGLOBS->dirty_low = value
#define getVideodirty_high() VGLOBS->dirty_high
#define setVideodirty_high(value) VGLOBS->dirty_high = value
#define getVideovideo_copy() VGLOBS->video_copy
#define setVideovideo_copy(value) VGLOBS->video_copy = value
#define getVideomark_byte() VGLOBS->mark_byte
#define setVideomark_byte(value) VGLOBS->mark_byte = value
#define getVideomark_word() VGLOBS->mark_word
#define setVideomark_word(value) VGLOBS->mark_word = value
#define getVideomark_string() VGLOBS->mark_string
#define setVideomark_string(value) VGLOBS->mark_string = value
#define getVideoread_shift_count() VGLOBS->read_shift_count
#define setVideoread_shift_count(value) VGLOBS->read_shift_count = value
#define getVideoread_mapped_plane() VGLOBS->read_mapped_plane
#define setVideoread_mapped_plane(value) VGLOBS->read_mapped_plane = value
#define getVideocolour_comp() VGLOBS->colour_comp
#define setVideocolour_comp(value) VGLOBS->colour_comp = value
#define getVideodont_care() VGLOBS->dont_care
#define setVideodont_care(value) VGLOBS->dont_care = value
#define getVideov7_bank_vid_copy_off() VGLOBS->v7_vid_copy_off
#define setVideov7_bank_vid_copy_off(value) VGLOBS->v7_vid_copy_off = value
#define getVideoscreen_ptr() VGLOBS->screen_ptr
#define setVideoscreen_ptr(value) VGLOBS->screen_ptr = value
#define getVideorotate() VGLOBS->rotate
#define setVideorotate(value) VGLOBS->rotate = value
#define getVideocalc_data_xor() calc_data_xor
#define setVideocalc_data_xor(value) calc_data_xor = value
#define getVideocalc_latch_xor() calc_latch_xor
#define setVideocalc_latch_xor(value) calc_latch_xor = value
#define getVideoread_byte_addr()
#define setVideoread_byte_addr(value)
#define getVideov7_fg_latches() fg_latches
#define setVideov7_fg_latches(value) fg_latches = value
#define getVideoGC_regs()
#define setVideoGC_regs(value)
#define getVideolast_GC_index()
#define setVideolast_GC_index(value)
#define getVideodither()
#define setVideodither(value)
#define getVideowrmode()
#define setVideowrmode(value)
#define getVideochain()
#define setVideochain(value)
#define getVideowrstate()
#define setVideowrstate(value)
#else /* CPU_40_STYLE */
extern void setVideorplane IPT1(IU8 *, value);
extern IU8 * getVideorplane IPT0();
extern void setVideowplane IPT1(IU8 *, value);
extern IU8 * getVideowplane IPT0();
extern void setVideoscratch IPT1(IU8 *, value);
extern IU8 * getVideoscratch IPT0();
extern void setVideosr_masked_val IPT1(IU32, value);
extern IU32 getVideosr_masked_val IPT0();
extern void setVideosr_nmask IPT1(IU32, value);
extern IU32 getVideosr_nmask IPT0();
extern void setVideodata_and_mask IPT1(IU32, value);
extern IU32 getVideodata_and_mask IPT0();
extern void setVideodata_xor_mask IPT1(IU32, value);
extern IU32 getVideodata_xor_mask IPT0();
extern void setVideolatch_xor_mask IPT1(IU32, value);
extern IU32 getVideolatch_xor_mask IPT0();
extern void setVideobit_prot_mask IPT1(IU32, value);
extern IU32 getVideobit_prot_mask IPT0();
extern void setVideoplane_enable IPT1(IU32, value);
extern IU32 getVideoplane_enable IPT0();
extern void setVideoplane_enable_mask IPT1(IU32, value);
extern IU32 getVideoplane_enable_mask IPT0();
extern void setVideosr_lookup IPT1(IUH *, value);
extern IUH * getVideosr_lookup IPT0();
extern void setVideofwd_str_read_addr IPT1(IUH *, value);
extern IUH * getVideofwd_str_read_addr IPT0();
extern void setVideobwd_str_read_addr IPT1(IUH *, value);
extern IUH * getVideobwd_str_read_addr IPT0();
extern void setVideodirty_total IPT1(IU32, value);
extern IU32 getVideodirty_total IPT0();
extern void setVideodirty_low IPT1(IS32, value);
extern IS32 getVideodirty_low IPT0();
extern void setVideodirty_high IPT1(IS32, value);
extern IS32 getVideodirty_high IPT0();
extern void setVideovideo_copy IPT1(IU8 *, value);
extern IU8 * getVideovideo_copy IPT0();
extern void setVideomark_byte IPT1(IUH *, value);
extern IUH * getVideomark_byte IPT0();
extern void setVideomark_word IPT1(IUH *, value);
extern IUH * getVideomark_word IPT0();
extern void setVideomark_string IPT1(IUH *, value);
extern IUH * getVideomark_string IPT0();
extern void setVideoread_shift_count IPT1(IU32, value);
extern IU32 getVideoread_shift_count IPT0();
extern void setVideoread_mapped_plane IPT1(IU32, value);
extern IU32 getVideoread_mapped_plane IPT0();
extern void setVideocolour_comp IPT1(IU32, value);
extern IU32 getVideocolour_comp IPT0();
extern void setVideodont_care IPT1(IU32, value);
extern IU32 getVideodont_care IPT0();
extern void setVideov7_bank_vid_copy_off IPT1(IU32, value);
extern IU32 getVideov7_bank_vid_copy_off IPT0();
extern void setVideoscreen_ptr IPT1(IU8 *, value);
extern IU8 * getVideoscreen_ptr IPT0();
extern void setVideorotate IPT1(IU32, value);
extern IU32 getVideorotate IPT0();
extern void setVideocalc_data_xor IPT1(IU32, value);
extern IU32 getVideocalc_data_xor IPT0();
extern void setVideocalc_latch_xor IPT1(IU32, value);
extern IU32 getVideocalc_latch_xor IPT0();
extern void setVideoread_byte_addr IPT1(IUH *, value);
extern IUH * getVideoread_byte_addr IPT0();
extern void setVideov7_fg_latches IPT1(IU32, value);
extern IU32 getVideov7_fg_latches IPT0();
extern void setVideoGC_regs IPT1(IUH **, value);
extern IUH ** getVideoGC_regs IPT0();
extern void setVideolast_GC_index IPT1(IU8, value);
extern IU8 getVideolast_GC_index IPT0();
extern void setVideodither IPT1(IU8, value);
extern IU8 getVideodither IPT0();
extern void setVideowrmode IPT1(IU8, value);
extern IU8 getVideowrmode IPT0();
extern void setVideochain IPT1(IU8, value);
extern IU8 getVideochain IPT0();
extern void setVideowrstate IPT1(IU8, value);
extern IU8 getVideowrstate IPT0();
#include "evidgen.h" /* generated by MkCpuInt */
#ifdef C_VID
extern struct VideoVector C_Video; /* in (generated) vglfunc.c */
#undef getVideolatches
#define getVideolatches() ((*(C_Video.GetVideolatches))())
#undef setVideolatches
#define setVideolatches(value) ( (*(C_Video.SetVideolatches))(value))
#undef SetWritePointers
#define SetWritePointers setWritePointers
#undef SetReadPointers
#define SetReadPointers setReadPointers
#undef SetMarkPointers
#define SetMarkPointers setMarkPointers
#endif /* C_VID */
#endif /* CPU_40_STYLE */
#define write_state EGA_CPU.ega_state.state
#define UNCHAINED 0
#define CHAIN2 1
#define CHAIN4 2
IMPORT ULONG sr_lookup[16];
#define N_WRITE_TYPES 24
#ifdef CPU_40_STYLE
extern IU32 latchval; /* used for following latch macros */
#define get_latch(n) \
(latchval = getVideolatches(),\
(* ((UTINY *) (&latchval) + n)))
#define get_latch0 get_latch(0)
#define get_latch1 get_latch(1)
#define get_latch2 get_latch(2)
#define get_latch3 get_latch(3)
#define get_latch01 \
(latchval = getVideolatches(), \
(* (USHORT *) (&latchval)))
#define get_latch23 \
(latchval = getVideolatches(), \
(* (USHORT *) (&latchval + 2)))
#define put_latch(n, value) \
(* ((UTINY *) (&latchval) + n) = (value), \
setVideolatches(latchval))
#define put_latch0(value) put_latch(0, value)
#define put_latch1(value) put_latch(1, value)
#define put_latch2(value) put_latch(2, value)
#define put_latch3(value) put_latch(3, value)
#else /* CPU_40_STYLE */
#define get_latch(n) (* ((UTINY *) (&VGLOBS->latches) + n))
#define get_latch0 get_latch(0)
#define get_latch1 get_latch(1)
#define get_latch2 get_latch(2)
#define get_latch3 get_latch(3)
#define get_latch01 (* (USHORT *) (&VGLOBS->latches))
#define get_latch23 (* (USHORT *) (&VGLOBS->latches + 2))
#define put_latch(n, value) * ((UTINY *) (&VGLOBS->latches) + n) = (value)
#define put_latch0(value) put_latch(0, value)
#define put_latch1(value) put_latch(1, value)
#define put_latch2(value) put_latch(2, value)
#define put_latch3(value) put_latch(3, value)
#endif /* CPU_40_STYLE */
/*
* macro to do the logical operations on cpu data and the latch values
*/
#define do_logicals(val,latch) (((latch) & ((val & getVideodata_and_mask()) \
^ getVideodata_xor_mask())) | (val & ((latch) ^ getVideolatch_xor_mask())))
/* Routines */
extern void ega_mode0_gen_chn_b_write IPT1(byte *,arg1);
extern void ega_mode0_gen_chn_w_write IPT1(byte *,arg1);
extern void ega_mode0_gen_chn_b_fill IPT2(byte *,arg1, byte *,arg2);
extern void ega_mode0_gen_chn_w_fill IPT2(byte *,arg1, byte *,arg2);
extern void ega_mode0_gen_chn_b_move IPT2(byte *,arg1, byte *,arg2);
extern void ega_mode1_gen_chn_b_write IPT1(byte *,arg1);
extern void ega_mode1_gen_chn_w_write IPT1(byte *,arg1);
extern void ega_mode1_gen_chn_b_fill IPT2(byte *,arg1, byte *,arg2);
extern void ega_mode1_gen_chn_w_fill IPT2(byte *,arg1, byte *,arg2);
extern void ega_mode1_gen_chn_b_move IPT2(byte *,arg1, byte *,arg2);
extern void ega_mode1_gen_chn_w_move IPT2(byte *,arg1, byte *,arg2);
extern void ega_mode2_gen_chn_b_write IPT1(byte *,arg1);
extern void ega_mode2_gen_chn_w_write IPT1(byte *,arg1);
extern void ega_mode2_gen_chn_b_fill IPT2(byte *,arg1, byte *,arg2);
extern void ega_mode2_gen_chn_w_fill IPT2(byte *,arg1, byte *,arg2);
extern void ega_mode2_gen_chn_b_move IPT2(byte *,arg1, byte *,arg2);
extern void ega_mode2_gen_chn_w_move IPT2(byte *,arg1, byte *,arg2);
/* 1 plane masked write */
extern void ega_mode0_copy1_mask_b_write0 IPT1(byte *,arg1);
extern void ega_mode0_copy1_mask_b_write1 IPT1(byte *,arg1);
extern void ega_mode0_copy1_mask_b_write2 IPT1(byte *,arg1);
extern void ega_mode0_copy1_mask_b_write3 IPT1(byte *,arg1);
#ifdef VGG
extern boolean vga_mode0_gen_chn4_b_write IPT0();
extern boolean vga_mode0_gen_chn4_w_write IPT0();
extern boolean vga_mode0_gen_chn4_b_fill IPT0();
extern boolean vga_mode0_gen_chn4_w_fill IPT0();
extern boolean vga_mode0_gen_chn4_b_move IPT0();
/* wr 1 */
extern boolean vga_mode1_gen_chn4_b_write IPT0();
extern boolean vga_mode1_gen_chn4_w_write IPT0();
extern boolean vga_mode1_gen_chn4_b_fill IPT0();
extern boolean vga_mode1_gen_chn4_w_fill IPT0();
extern boolean vga_mode1_gen_chn4_b_move IPT0();
extern boolean vga_mode1_gen_chn4_w_move IPT0();
/* wr 2 */
extern boolean vga_mode2_gen_chn4_b_write IPT0();
extern boolean vga_mode2_gen_chn4_w_write IPT0();
extern boolean vga_mode2_gen_chn4_b_fill IPT0();
extern boolean vga_mode2_gen_chn4_w_fill IPT0();
extern boolean vga_mode2_gen_chn4_b_move IPT0();
extern boolean vga_mode2_gen_chn4_w_move IPT0();
/* wr 3 */
extern boolean vga_mode3_gen_chn4_b_write IPT0();
extern boolean vga_mode3_gen_chn4_w_write IPT0();
extern boolean vga_mode3_gen_chn4_b_fill IPT0();
extern boolean vga_mode3_gen_chn4_w_fill IPT0();
extern boolean vga_mode3_gen_chn4_b_move IPT0();
extern boolean vga_mode3_gen_chn4_w_move IPT0();
extern boolean vga_mode3_gen_chn_b_write IPT0();
extern boolean vga_mode3_gen_chn_w_write IPT0();
extern boolean vga_mode3_gen_chn_b_fill IPT0();
extern boolean vga_mode3_gen_chn_w_fill IPT0();
extern boolean vga_mode3_gen_chn_b_move IPT0();
extern boolean vga_mode3_gen_chn_w_move IPT0();
extern boolean vga_mode3_gen_b_write IPT0();
extern boolean vga_mode3_gen_w_write IPT0();
extern boolean vga_mode3_gen_b_fill IPT0();
extern boolean vga_mode3_gen_w_fill IPT0();
extern boolean vga_mode3_gen_b_move IPT0();
extern boolean vga_mode3_gen_w_move IPT0();
#endif /* VGG */