mirror of https://github.com/lianthony/NT4.0
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
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 */
|